{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6b439e84-8c6b-4126-8586-d7a1a7c7614e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 该代码文件主要为了在CIFAR10上执行相关实验，获取实验数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "daf0a1f8-ef8d-4246-b945-b6e5d905f5f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 基线，基于阈值，似然比，添加噪声鲁棒性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3a72ff09-8088-4a9d-b1f7-0825ff54c477",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 实验目标，可变的参数，输出的结果\n",
    "# 预期结果\n",
    "# 1、高风险指标的损失分布直方图\n",
    "# 2、base攻击成功率随风险变化图\n",
    "# 3、离群点邻居、距离参数控制的输出点\n",
    "# 4、同一种攻击方式、离群点和风险指标的攻击成功率对比\n",
    "# 5、同样的风险点，不同攻击方法的成功率比较\n",
    "# 6、模型训练集大小的影响\n",
    "# 7、参考模型数量的影响\n",
    "\n",
    "\n",
    "# 需要控制的实验参数：\n",
    "# 1、攻击方法\n",
    "# 2、离群点比例\n",
    "# 3、模型训练集大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b61f101e-1c1e-41df-b80b-65d1e3d6eab8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "from torch.utils.data import DataLoader\n",
    "from torch.utils.data import Dataset\n",
    "from torchvision import datasets\n",
    "from torchvision import transforms\n",
    "from torchvision.transforms import ToTensor\n",
    "import torchvision.transforms as tt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics\n",
    "\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "37ddaa77-35ce-49b9-acfd-a7799aadd9a5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入自己创建的python文件\n",
    "import sys\n",
    "sys.path.append(\"..\") # Adds higher directory to python modules path.\n",
    "from frame.DataProcess import *\n",
    "from frame.TrainUtil import *\n",
    "from frame.LIRAAttack import *\n",
    "from frame.AttackUtil import *\n",
    "from frame.ShadowAttack import *\n",
    "from frame.ThresholdAttack import *\n",
    "from frame.LabelAttack import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4636a18e-244e-4a21-ba21-591c0295ce7a",
   "metadata": {},
   "outputs": [],
   "source": [
    "LEARNING_RATE = 1e-2\n",
    "BATCH_SIZE = 128\n",
    "MODEL = 'CNN'\n",
    "EPOCHS = 50\n",
    "DATA_NAME = 'CIFAR10' \n",
    "weight_dir = os.path.join('..', 'weights_for_exp', DATA_NAME)\n",
    "weight_dir = os.path.join('..', 'weights_for_exp', DATA_NAME)\n",
    "num_shadowsets = 100\n",
    "seed = 0\n",
    "prop_keep = 0.5\n",
    "\n",
    "model_transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.507, 0.487, 0.441], std=[0.267, 0.256, 0.276])\n",
    "    ])\n",
    "attack_transform = transforms.Compose([])\n",
    "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
    "\n",
    "# 影子模型攻击相关参数\n",
    "sha_models = [1,2,3] #[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]\n",
    "tar_model = 0\n",
    "attack_class = False #是否针对每个类别分别攻击\n",
    "attack_lr = 5e-4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e8818f5c-0cf8-4635-a3d6-292f91f14d75",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "# 加载完整的训练数据集\n",
    "X_data, Y_data, train_keep = load_CIFAR10_keep(num_shadowsets, prop_keep, seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "1754e859-f23b-4a3c-8666-b2ce06c2b8f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = CustomDataset(X_data, Y_data, model_transform)\n",
    "train_dataloader = DataLoader(train_data, batch_size=64, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0e839f4d-93e7-48f0-af07-349ebef049a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = BATCH_SIZE\n",
    "model = MODEL\n",
    "epochs = EPOCHS\n",
    "data_name = DATA_NAME \n",
    "weight_part = \"{}_{}_epoch{}_model\".format(data_name, model, epochs)\n",
    "# weight_part = \"{}_{}_epoch{}_shadownum50_model\".format(data_name, model, epochs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3675c318-0787-465b-9741-a718fdb265e9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8267640a-f998-4c1c-b9b0-2cdd22bae377",
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "create_CNN_model() missing 1 required positional argument: 'data_name'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m Model \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mglobals\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcreate_\u001b[39;49m\u001b[38;5;132;43;01m{}\u001b[39;49;00m\u001b[38;5;124;43m_model\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mformat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[43mY_data\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "\u001b[0;31mTypeError\u001b[0m: create_CNN_model() missing 1 required positional argument: 'data_name'"
     ]
    }
   ],
   "source": [
    "Model = globals()['create_{}_model'.format(model)](Y_data.max()+1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7a5d38f5-d518-40ba-874f-26d6508e9f6c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "weight_path = os.path.join(weight_dir, weight_part + \"{}.pth\".format(19))\n",
    "# print(Reference_Model)\n",
    "Model.load_state_dict(torch.load(weight_path))\n",
    "Model.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a4be86bf-1148-4601-b35d-c440703f6477",
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_fn = nn.CrossEntropyLoss()\n",
    "evaluate(train_dataloader, Model, loss_fn, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b9478602-7d5c-437d-8a3a-6637527a2351",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4a659f5e-de7f-490c-996e-2015ff6e2a05",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "adadbecb-66e5-4b2b-9651-a6469c2cdc5c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "8bf4ae41-482b-464b-b2df-f79924f00fe2",
   "metadata": {},
   "source": [
    "## 脆弱点的两种提取方式"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a20f6954-5154-483b-a64b-8ab536b4989b",
   "metadata": {},
   "source": [
    "### 风险指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "90586eba-a7f4-4a19-a8a8-54d5d8633693",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# # 加载所有参考模型上的损失、置信度、得分输出\n",
    "# conf_data_all, label_data, score_all = load_score_data_all(X_data, Y_data, weight_dir, num_shadowsets, data_name, model, weight_part, model_transform, batch_size, device)\n",
    "# loss_fn = nn.CrossEntropyLoss(reduction='none')\n",
    "# loss_data_all, label_data = load_loss_data_all(X_data, Y_data, loss_fn, weight_dir, num_shadowsets, data_name, model, weight_part, model_transform, batch_size, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "5fbe2bf6-1750-4c23-91a8-80caf9b0825e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# np.save('CIFAR10_loss.npy', loss_data_all)\n",
    "# np.save('CIFAR10_score.npy', score_all)\n",
    "# np.save('CIFAR10_conf.npy', conf_data_all)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5a6e9c56-60bd-4bfc-a912-5e3b5eb52a4e",
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_data_all = np.load('CIFAR10_loss.npy')\n",
    "score_all = np.load('CIFAR10_score.npy')\n",
    "conf_data_all = np.load('CIFAR10_conf.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8b45bd6b-c391-4ced-99bd-57b0b8c3c30b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为每个数据点计算风险指标\n",
    "# 计算出一个点的脆弱程度评分\n",
    "pri_risk_all = get_risk_score(loss_data_all, train_keep)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d8258b9c-d6f3-4e64-ab4f-4b068bb4b209",
   "metadata": {},
   "outputs": [],
   "source": [
    "pri_risk_rank = np.argsort(pri_risk_all)\n",
    "pri_risk_rank = np.flip(pri_risk_rank)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16cc7233-a9a0-4e74-990d-70e0e6ebfb74",
   "metadata": {},
   "source": [
    "### 离群点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "e7e42cbf-89f1-4d1f-bbd0-dc87252c22cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 准备好logits的输出\n",
    "# 计算余弦相似度 5w*5w的大型矩阵\n",
    "# 邻居距离alpha，邻居数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8d4c50e3-0ca3-463c-ad2a-4e4fd987b12e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# logits_data_all, label_data = load_logits_data_all(X_data, Y_data, weight_dir, num_shadowsets, data_name, model, weight_part, model_transform, batch_size, device)\n",
    "# np.save('CIFAR10_ResNet18_logits.npy', logits_data_all)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "a9314bc7-f529-46f5-834b-d1c387effef7",
   "metadata": {},
   "outputs": [],
   "source": [
    "logits_data_all = np.load('CIFAR10_logits.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "50d2365f-9e9d-4ffc-a9f7-16c1d3ed5646",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 按照k个模型进行拼接\n",
    "# k = 10\n",
    "# for i in range(k):\n",
    "#     if i == 0:\n",
    "#         combine_features = logits_data_all[i]\n",
    "#     else:\n",
    "#         combine_features = np.concatenate((combine_features, logits_data_all[i]),axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1308ab27-3798-4a3c-8dd2-b5ce0234042e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# # 数据量太大，不能保存所有的余弦相似度，只能需要时计算\n",
    "# alpha_list = [0.05, 0.1, 0.12, 0.15, 0.2, 0.3]\n",
    "# n_num_list = []\n",
    "# # for i in range(combine_features.shape[0]):\n",
    "# for i in range(10000):\n",
    "#     n_count = [0 for _ in alpha_list]\n",
    "#     if i%50 == 0:\n",
    "#         print(f\"compute to: {i}\")\n",
    "#     for j in range(combine_features.shape[0]):\n",
    "#         # 余弦距离的计算\n",
    "#         vec1 = combine_features[i]\n",
    "#         vec2 = combine_features[j]        \n",
    "#         cos_sim = vec1.dot(vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))\n",
    "#         cos_dis = 0.5 - 0.5 * cos_sim\n",
    "#         for m in range(len(alpha_list)):\n",
    "#             if (cos_dis < alpha_list[m]):\n",
    "#                 n_count[m] += 1\n",
    "#     n_num_list.append(n_count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "ae886e98-bf25-4c0d-a2fa-f2c948574aa8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# neigh_data_all = np.array(n_num_list)\n",
    "# np.save('CIFAR10_neigh.npy', neigh_data_all)\n",
    "neigh_data_all = np.load('CIFAR10_neigh.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "79592536-1181-4647-9e40-fc959daa668e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000, 6)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "neigh_data_all.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "9d815b0b-568b-46d5-bdeb-fba567a8e213",
   "metadata": {},
   "outputs": [],
   "source": [
    "neigh_num = neigh_data_all[:,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "7bc974ea-ffb5-432f-b9da-ab7abce10270",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000,)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "neigh_num.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "ddd4b8fa-1653-4bab-bf8f-4e2a116b17b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "risk_rank = np.argsort(neigh_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "789a839a-cb2b-4da7-a1a2-ecac971344ef",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([29631, 39852, 26325, ..., 47315, 41363, 17410])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "risk_rank"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cce6c5e2-b030-4874-b08e-bf8466815484",
   "metadata": {},
   "source": [
    "## 针对脆弱点展开攻击"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14cb98e0-737b-4ed0-93bd-a52681974606",
   "metadata": {},
   "source": [
    "### 基线攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "8e77dd23-803c-49f9-98b9-cf03a3fe2ad9",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = 5000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "8c66acdc-645a-4cf8-b0f6-babc51bce18a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测正确的判断为成员，预测不正确的判断为非成员"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "ecc0a131-e71a-4cd1-b5a3-a6c750abc382",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "CNN(\n",
       "  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "  (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "  (conv3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "  (fc1): Linear(in_features=1024, out_features=500, bias=True)\n",
       "  (fc2): Linear(in_features=500, out_features=10, bias=True)\n",
       "  (BatchNorm1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (BatchNorm2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (BatchNorm3): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       ")"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 创建对应的目标模型\n",
    "if model in ['NN', 'NN_4layer']:\n",
    "    Target_Model = globals()['create_{}_model'.format(model)](X_data.shape[1], Y_data.max()+1)\n",
    "elif model == 'CNN':\n",
    "    Target_Model = globals()['create_{}_model'.format(model)](Y_data.max()+1, data_name)\n",
    "# 加载参数\n",
    "weight_path = os.path.join(weight_dir, \"{}_{}_epoch{}_model{}.pth\".format(data_name, model, epochs, tar_model))\n",
    "# print(Reference_Model)\n",
    "Target_Model.load_state_dict(torch.load(weight_path))\n",
    "Target_Model.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "670ebafe-5710-4b0c-b05d-008a6098dbc8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Error: \n",
      " Accuracy: 84.7%, Avg loss: 1.124064 \n",
      "\n"
     ]
    }
   ],
   "source": [
    "loss_fn = nn.CrossEntropyLoss()\n",
    "pred_result = base_attack(train_dataloader, Target_Model, loss_fn, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "d0dfd319-c536-4a57-a2b9-246f9a577f60",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8\n",
      "0.916\n"
     ]
    }
   ],
   "source": [
    "pred_clip = pred_result[risk_rank[:x]]\n",
    "mem_clip = train_keep[0][risk_rank[:x]]\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)\n",
    "\n",
    "pred_clip = pred_result[pri_risk_rank[:x]]\n",
    "mem_clip = train_keep[0][pri_risk_rank[:x]]\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c08b9a40-068e-4411-8a51-13a05337a7cd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "5cf3f668-0b0b-41b1-bc5f-73f89bed9169",
   "metadata": {},
   "source": [
    "### 阈值攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "61729130-6c97-4a19-b7c5-767f6ba1ae70",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 基于损失的阈值去做攻击，阈值如何确定？两个均值的均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "0dd9f430-c918-47cd-9e8d-4ee1b35bf143",
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_threshold = get_loss_threshold(loss_data_all, train_keep)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "18f8fd0e-f86a-47fc-8105-7a3a53b10b28",
   "metadata": {},
   "outputs": [],
   "source": [
    "target_loss = loss_data_all[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "09270911-4d24-4c91-9c59-224213d1c319",
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_result = target_loss < loss_threshold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "ef57e35b-e721-4cea-ad31-6b7cc4ef5362",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7938\n",
      "0.8614\n"
     ]
    }
   ],
   "source": [
    "pred_clip = pred_result[risk_rank[:x]]\n",
    "mem_clip = train_keep[0][risk_rank[:x]]\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)\n",
    "\n",
    "pred_clip = pred_result[pri_risk_rank[:x]]\n",
    "mem_clip = train_keep[0][pri_risk_rank[:x]]\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "736cdbcb-9dd3-45ab-bcc4-37c7f490a588",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8259bc0c-fbc1-4025-bf4a-b194236a39ff",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "786da5f1-1ae9-4f9b-ae7f-e18702ea84a7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "77876b58-669a-483a-b80c-8b041486eda0",
   "metadata": {},
   "source": [
    "### 似然比攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "f1304cdd-cd2c-437f-af20-bdd3eb68caab",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 先对所有目标数据执行攻击，然后根据脆弱点筛选获取对应的攻击成功率或者ROC\n",
    "# 输出两个，memlabel和pred_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c9ed8ba5-393b-4bdd-8a65-bbd6bbcaf4b6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC value is: 0.7769893964732137\n",
      "Accuracy is: 0.69174\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.69174"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred_result = LIRA_attack(train_keep, score_all, score_all[0], train_keep[0])\n",
    "evaluate_ROC(pred_result, train_keep[0], threshold=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "9bd68a0d-f892-4065-b08b-401f71bc20f7",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n",
      "10\n",
      "11\n",
      "12\n",
      "13\n",
      "14\n",
      "15\n",
      "16\n",
      "17\n",
      "18\n",
      "19\n",
      "20\n",
      "21\n",
      "22\n",
      "23\n",
      "24\n",
      "25\n",
      "26\n",
      "27\n",
      "28\n",
      "29\n",
      "30\n",
      "31\n",
      "32\n",
      "33\n",
      "34\n",
      "35\n",
      "36\n",
      "37\n",
      "38\n",
      "39\n",
      "40\n",
      "41\n",
      "42\n",
      "43\n",
      "44\n",
      "45\n",
      "46\n",
      "47\n",
      "48\n",
      "49\n",
      "50\n",
      "51\n",
      "52\n",
      "53\n",
      "54\n",
      "55\n",
      "56\n",
      "57\n",
      "58\n",
      "59\n",
      "60\n",
      "61\n",
      "62\n",
      "63\n",
      "64\n",
      "65\n",
      "66\n",
      "67\n",
      "68\n",
      "69\n",
      "70\n",
      "71\n",
      "72\n",
      "73\n",
      "74\n",
      "75\n",
      "76\n",
      "77\n",
      "78\n",
      "79\n",
      "80\n",
      "81\n",
      "82\n",
      "83\n",
      "84\n",
      "85\n",
      "86\n",
      "87\n",
      "88\n",
      "89\n",
      "90\n",
      "91\n",
      "92\n",
      "93\n",
      "94\n",
      "95\n",
      "96\n",
      "97\n",
      "98\n",
      "99\n"
     ]
    }
   ],
   "source": [
    "for i in range(num_shadowsets):\n",
    "    pred_result = LIRA_attack(train_keep, score_all, score_all[i], train_keep[i])\n",
    "    pred_result = pred_result.reshape(1, len(pred_result))\n",
    "    if i==0:\n",
    "        pred_result_all = pred_result\n",
    "    else:\n",
    "        pred_result_all = np.concatenate((pred_result_all, pred_result), axis=0)\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "e26d836c-a128-48eb-bf11-83295f6b3827",
   "metadata": {},
   "outputs": [],
   "source": [
    "lower_bound, upper_bound = 10, 100\n",
    "indices = np.where((pri_risk_all >= lower_bound) & (pri_risk_all <= upper_bound))\n",
    "pred_clip = pred_result_all[:, indices]\n",
    "mem_clip = train_keep[:, indices]\n",
    "pred_clip = pred_clip.flatten()\n",
    "mem_clip = mem_clip.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "1befa11f-7736-4b70-9009-aeaaf61e7db1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9492701525054467\n"
     ]
    }
   ],
   "source": [
    "pred_clip = pred_clip > 0\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4bc9c939-a4c3-4cb3-9286-3bab334665c3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "0d82af24-291e-4d15-a3eb-29a6600439b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_axi = []\n",
    "Y_axi = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "74fe8e82-5a07-4197-bcb8-318782f1f656",
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(10000):\n",
    "    pred_t = pred_result_all[:,i]\n",
    "    pred_t = pred_t > 0\n",
    "    mem_t = train_keep[:,i]\n",
    "    risk_t = pri_risk_all[i]\n",
    "    acc = metrics.accuracy_score(mem_t, pred_t)\n",
    "    X_axi.append(risk_t)\n",
    "    Y_axi.append(acc)\n",
    "\n",
    "df=pd.DataFrame({'risk': X_axi, 'attack_acc': Y_axi })\n",
    "df.to_csv('CIFAR10_risk_att.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4fe670f-9011-4bab-af6a-a207dc424ae9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a489e42f-bb40-4102-b7bf-3c433b72142c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "5fdb2095-a077-40a4-b954-c4947b015080",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8458\n",
      "0.9234\n"
     ]
    }
   ],
   "source": [
    "pred_clip = pred_result[risk_rank[:x]]\n",
    "mem_clip = train_keep[0][risk_rank[:x]]\n",
    "pred_clip = pred_clip > 0\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)\n",
    "\n",
    "pred_clip = pred_result[pri_risk_rank[:x]]\n",
    "mem_clip = train_keep[0][pri_risk_rank[:x]]\n",
    "pred_clip = pred_clip > 0\n",
    "accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35c96a5b-843d-4cb6-b964-f13dadac3193",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "26be2f5a-29e3-45c7-b6f0-c5382828f63f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "457be14e-4b30-488a-aab0-0ae0b345e27e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "8ea3f420-9a04-420f-83b6-06ea1658f6c7",
   "metadata": {},
   "source": [
    "### 影子模型攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "7c5e0038-e2b6-4997-a64f-c9e80ed2c9c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 在所有数据上执行一次攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "7d7fefb0-3e20-40e2-be99-4527c0f62306",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      " Error: \n",
      " Accuracy: 98.2%  \n",
      "\n",
      " Error: \n",
      " Accuracy: 70.7%  \n",
      "\n",
      "(50000, 10) (50000,) (50000,)\n",
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      " Error: \n",
      " Accuracy: 98.4%  \n",
      "\n",
      " Error: \n",
      " Accuracy: 70.9%  \n",
      "\n",
      "(50000, 10) (50000,) (50000,)\n",
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      " Error: \n",
      " Accuracy: 97.3%  \n",
      "\n",
      " Error: \n",
      " Accuracy: 70.7%  \n",
      "\n",
      "(50000, 10) (50000,) (50000,)\n",
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      " Error: \n",
      " Accuracy: 98.5%  \n",
      "\n",
      " Error: \n",
      " Accuracy: 70.9%  \n",
      "\n",
      "test data: (50000, 10) (50000,) (50000,)\n",
      "(150000, 10) (150000,)\n",
      "Attack_NN(\n",
      "  (linear_relu_stack): Sequential(\n",
      "    (0): Linear(in_features=3, out_features=128, bias=True)\n",
      "    (1): ReLU()\n",
      "    (2): Linear(in_features=128, out_features=64, bias=True)\n",
      "    (3): ReLU()\n",
      "    (4): Linear(in_features=64, out_features=1, bias=True)\n",
      "  )\n",
      ")\n",
      "Epoch 1\n",
      "-------------------------------\n",
      "loss: 0.697196  [   64/150000]\n",
      "loss: 0.680299  [ 6464/150000]\n",
      "loss: 0.651765  [12864/150000]\n",
      "loss: 0.658681  [19264/150000]\n",
      "loss: 0.700420  [25664/150000]\n",
      "loss: 0.658958  [32064/150000]\n",
      "loss: 0.647964  [38464/150000]\n",
      "loss: 0.686783  [44864/150000]\n",
      "loss: 0.663731  [51264/150000]\n",
      "loss: 0.645408  [57664/150000]\n",
      "loss: 0.686353  [64064/150000]\n",
      "loss: 0.643229  [70464/150000]\n",
      "loss: 0.657322  [76864/150000]\n",
      "loss: 0.701642  [83264/150000]\n",
      "loss: 0.678098  [89664/150000]\n",
      "loss: 0.661434  [96064/150000]\n",
      "loss: 0.690655  [102464/150000]\n",
      "loss: 0.662906  [108864/150000]\n",
      "loss: 0.679075  [115264/150000]\n",
      "loss: 0.659451  [121664/150000]\n",
      "loss: 0.647261  [128064/150000]\n",
      "loss: 0.613845  [134464/150000]\n",
      "loss: 0.681625  [140864/150000]\n",
      "loss: 0.644382  [147264/150000]\n",
      "Epoch 2\n",
      "-------------------------------\n",
      "loss: 0.660153  [   64/150000]\n",
      "loss: 0.635096  [ 6464/150000]\n",
      "loss: 0.662330  [12864/150000]\n",
      "loss: 0.638008  [19264/150000]\n",
      "loss: 0.605687  [25664/150000]\n",
      "loss: 0.685196  [32064/150000]\n",
      "loss: 0.596733  [38464/150000]\n",
      "loss: 0.656993  [44864/150000]\n",
      "loss: 0.653332  [51264/150000]\n",
      "loss: 0.678627  [57664/150000]\n",
      "loss: 0.672599  [64064/150000]\n",
      "loss: 0.724394  [70464/150000]\n",
      "loss: 0.617284  [76864/150000]\n",
      "loss: 0.690248  [83264/150000]\n",
      "loss: 0.668775  [89664/150000]\n",
      "loss: 0.651461  [96064/150000]\n",
      "loss: 0.667981  [102464/150000]\n",
      "loss: 0.633979  [108864/150000]\n",
      "loss: 0.652979  [115264/150000]\n",
      "loss: 0.611256  [121664/150000]\n",
      "loss: 0.663018  [128064/150000]\n",
      "loss: 0.654893  [134464/150000]\n",
      "loss: 0.668743  [140864/150000]\n",
      "loss: 0.711927  [147264/150000]\n",
      "Epoch 3\n",
      "-------------------------------\n",
      "loss: 0.664359  [   64/150000]\n",
      "loss: 0.651919  [ 6464/150000]\n",
      "loss: 0.655256  [12864/150000]\n",
      "loss: 0.681524  [19264/150000]\n",
      "loss: 0.673223  [25664/150000]\n",
      "loss: 0.672318  [32064/150000]\n",
      "loss: 0.679671  [38464/150000]\n",
      "loss: 0.679178  [44864/150000]\n",
      "loss: 0.626470  [51264/150000]\n",
      "loss: 0.705766  [57664/150000]\n",
      "loss: 0.687290  [64064/150000]\n",
      "loss: 0.650802  [70464/150000]\n",
      "loss: 0.630834  [76864/150000]\n",
      "loss: 0.636767  [83264/150000]\n",
      "loss: 0.671828  [89664/150000]\n",
      "loss: 0.599327  [96064/150000]\n",
      "loss: 0.623314  [102464/150000]\n",
      "loss: 0.704498  [108864/150000]\n",
      "loss: 0.686276  [115264/150000]\n",
      "loss: 0.634417  [121664/150000]\n",
      "loss: 0.638336  [128064/150000]\n",
      "loss: 0.608289  [134464/150000]\n",
      "loss: 0.637650  [140864/150000]\n",
      "loss: 0.661929  [147264/150000]\n",
      "Epoch 4\n",
      "-------------------------------\n",
      "loss: 0.612224  [   64/150000]\n",
      "loss: 0.671481  [ 6464/150000]\n",
      "loss: 0.673360  [12864/150000]\n",
      "loss: 0.641943  [19264/150000]\n",
      "loss: 0.661327  [25664/150000]\n",
      "loss: 0.611829  [32064/150000]\n",
      "loss: 0.645982  [38464/150000]\n",
      "loss: 0.705175  [44864/150000]\n",
      "loss: 0.609837  [51264/150000]\n",
      "loss: 0.704957  [57664/150000]\n",
      "loss: 0.596864  [64064/150000]\n",
      "loss: 0.636928  [70464/150000]\n",
      "loss: 0.598786  [76864/150000]\n",
      "loss: 0.664714  [83264/150000]\n",
      "loss: 0.667095  [89664/150000]\n",
      "loss: 0.642853  [96064/150000]\n",
      "loss: 0.649327  [102464/150000]\n",
      "loss: 0.626750  [108864/150000]\n",
      "loss: 0.642891  [115264/150000]\n",
      "loss: 0.717029  [121664/150000]\n",
      "loss: 0.648178  [128064/150000]\n",
      "loss: 0.695486  [134464/150000]\n",
      "loss: 0.682452  [140864/150000]\n",
      "loss: 0.672504  [147264/150000]\n",
      "Epoch 5\n",
      "-------------------------------\n",
      "loss: 0.675683  [   64/150000]\n",
      "loss: 0.589633  [ 6464/150000]\n",
      "loss: 0.699399  [12864/150000]\n",
      "loss: 0.673551  [19264/150000]\n",
      "loss: 0.619649  [25664/150000]\n",
      "loss: 0.670703  [32064/150000]\n",
      "loss: 0.650322  [38464/150000]\n",
      "loss: 0.592783  [44864/150000]\n",
      "loss: 0.669470  [51264/150000]\n",
      "loss: 0.685736  [57664/150000]\n",
      "loss: 0.622014  [64064/150000]\n",
      "loss: 0.648420  [70464/150000]\n",
      "loss: 0.600167  [76864/150000]\n",
      "loss: 0.671242  [83264/150000]\n",
      "loss: 0.637286  [89664/150000]\n",
      "loss: 0.657509  [96064/150000]\n",
      "loss: 0.642806  [102464/150000]\n",
      "loss: 0.638484  [108864/150000]\n",
      "loss: 0.611897  [115264/150000]\n",
      "loss: 0.621960  [121664/150000]\n",
      "loss: 0.642744  [128064/150000]\n",
      "loss: 0.715894  [134464/150000]\n",
      "loss: 0.647303  [140864/150000]\n",
      "loss: 0.641905  [147264/150000]\n",
      "Epoch 6\n",
      "-------------------------------\n",
      "loss: 0.677922  [   64/150000]\n",
      "loss: 0.639789  [ 6464/150000]\n",
      "loss: 0.597659  [12864/150000]\n",
      "loss: 0.667515  [19264/150000]\n",
      "loss: 0.629644  [25664/150000]\n",
      "loss: 0.643694  [32064/150000]\n",
      "loss: 0.631197  [38464/150000]\n",
      "loss: 0.635144  [44864/150000]\n",
      "loss: 0.635412  [51264/150000]\n",
      "loss: 0.642528  [57664/150000]\n",
      "loss: 0.709254  [64064/150000]\n",
      "loss: 0.621245  [70464/150000]\n",
      "loss: 0.677041  [76864/150000]\n",
      "loss: 0.645070  [83264/150000]\n",
      "loss: 0.647604  [89664/150000]\n",
      "loss: 0.657027  [96064/150000]\n",
      "loss: 0.707189  [102464/150000]\n",
      "loss: 0.617856  [108864/150000]\n",
      "loss: 0.724823  [115264/150000]\n",
      "loss: 0.684138  [121664/150000]\n",
      "loss: 0.656155  [128064/150000]\n",
      "loss: 0.608881  [134464/150000]\n",
      "loss: 0.646603  [140864/150000]\n",
      "loss: 0.662633  [147264/150000]\n",
      "Epoch 7\n",
      "-------------------------------\n",
      "loss: 0.649178  [   64/150000]\n",
      "loss: 0.558168  [ 6464/150000]\n",
      "loss: 0.626086  [12864/150000]\n",
      "loss: 0.655364  [19264/150000]\n",
      "loss: 0.648062  [25664/150000]\n",
      "loss: 0.678114  [32064/150000]\n",
      "loss: 0.619258  [38464/150000]\n",
      "loss: 0.603084  [44864/150000]\n",
      "loss: 0.637042  [51264/150000]\n",
      "loss: 0.655832  [57664/150000]\n",
      "loss: 0.629587  [64064/150000]\n",
      "loss: 0.642976  [70464/150000]\n",
      "loss: 0.622904  [76864/150000]\n",
      "loss: 0.637156  [83264/150000]\n",
      "loss: 0.633858  [89664/150000]\n",
      "loss: 0.699953  [96064/150000]\n",
      "loss: 0.663130  [102464/150000]\n",
      "loss: 0.663190  [108864/150000]\n",
      "loss: 0.666445  [115264/150000]\n",
      "loss: 0.670916  [121664/150000]\n",
      "loss: 0.666350  [128064/150000]\n",
      "loss: 0.682667  [134464/150000]\n",
      "loss: 0.617496  [140864/150000]\n",
      "loss: 0.677898  [147264/150000]\n",
      "Epoch 8\n",
      "-------------------------------\n",
      "loss: 0.637470  [   64/150000]\n",
      "loss: 0.612026  [ 6464/150000]\n",
      "loss: 0.689309  [12864/150000]\n",
      "loss: 0.581715  [19264/150000]\n",
      "loss: 0.644870  [25664/150000]\n",
      "loss: 0.687109  [32064/150000]\n",
      "loss: 0.680947  [38464/150000]\n",
      "loss: 0.689507  [44864/150000]\n",
      "loss: 0.659242  [51264/150000]\n",
      "loss: 0.655534  [57664/150000]\n",
      "loss: 0.670064  [64064/150000]\n",
      "loss: 0.667756  [70464/150000]\n",
      "loss: 0.658024  [76864/150000]\n",
      "loss: 0.659326  [83264/150000]\n",
      "loss: 0.648118  [89664/150000]\n",
      "loss: 0.654643  [96064/150000]\n",
      "loss: 0.642622  [102464/150000]\n",
      "loss: 0.613614  [108864/150000]\n",
      "loss: 0.712423  [115264/150000]\n",
      "loss: 0.651511  [121664/150000]\n",
      "loss: 0.648076  [128064/150000]\n",
      "loss: 0.641261  [134464/150000]\n",
      "loss: 0.618398  [140864/150000]\n",
      "loss: 0.607730  [147264/150000]\n",
      "Epoch 9\n",
      "-------------------------------\n",
      "loss: 0.603105  [   64/150000]\n",
      "loss: 0.618794  [ 6464/150000]\n",
      "loss: 0.620416  [12864/150000]\n",
      "loss: 0.643879  [19264/150000]\n",
      "loss: 0.652147  [25664/150000]\n",
      "loss: 0.614240  [32064/150000]\n",
      "loss: 0.669746  [38464/150000]\n",
      "loss: 0.619092  [44864/150000]\n",
      "loss: 0.684066  [51264/150000]\n",
      "loss: 0.599324  [57664/150000]\n",
      "loss: 0.671974  [64064/150000]\n",
      "loss: 0.637016  [70464/150000]\n",
      "loss: 0.643799  [76864/150000]\n",
      "loss: 0.656417  [83264/150000]\n",
      "loss: 0.638615  [89664/150000]\n",
      "loss: 0.678190  [96064/150000]\n",
      "loss: 0.648979  [102464/150000]\n",
      "loss: 0.577128  [108864/150000]\n",
      "loss: 0.641673  [115264/150000]\n",
      "loss: 0.676156  [121664/150000]\n",
      "loss: 0.633874  [128064/150000]\n",
      "loss: 0.639776  [134464/150000]\n",
      "loss: 0.661746  [140864/150000]\n",
      "loss: 0.637478  [147264/150000]\n",
      "Epoch 10\n",
      "-------------------------------\n",
      "loss: 0.655198  [   64/150000]\n",
      "loss: 0.703542  [ 6464/150000]\n",
      "loss: 0.656509  [12864/150000]\n",
      "loss: 0.647899  [19264/150000]\n",
      "loss: 0.640973  [25664/150000]\n",
      "loss: 0.719150  [32064/150000]\n",
      "loss: 0.666841  [38464/150000]\n",
      "loss: 0.582749  [44864/150000]\n",
      "loss: 0.678233  [51264/150000]\n",
      "loss: 0.598100  [57664/150000]\n",
      "loss: 0.666816  [64064/150000]\n",
      "loss: 0.675014  [70464/150000]\n",
      "loss: 0.598722  [76864/150000]\n",
      "loss: 0.645439  [83264/150000]\n",
      "loss: 0.700756  [89664/150000]\n",
      "loss: 0.619187  [96064/150000]\n",
      "loss: 0.608391  [102464/150000]\n",
      "loss: 0.641113  [108864/150000]\n",
      "loss: 0.677912  [115264/150000]\n",
      "loss: 0.647659  [121664/150000]\n",
      "loss: 0.649806  [128064/150000]\n",
      "loss: 0.685570  [134464/150000]\n",
      "loss: 0.623115  [140864/150000]\n",
      "loss: 0.648981  [147264/150000]\n",
      "Epoch 11\n",
      "-------------------------------\n",
      "loss: 0.675235  [   64/150000]\n",
      "loss: 0.555799  [ 6464/150000]\n",
      "loss: 0.655777  [12864/150000]\n",
      "loss: 0.684197  [19264/150000]\n",
      "loss: 0.648044  [25664/150000]\n",
      "loss: 0.587771  [32064/150000]\n",
      "loss: 0.642649  [38464/150000]\n",
      "loss: 0.674737  [44864/150000]\n",
      "loss: 0.669177  [51264/150000]\n",
      "loss: 0.615034  [57664/150000]\n",
      "loss: 0.659451  [64064/150000]\n",
      "loss: 0.628747  [70464/150000]\n",
      "loss: 0.626125  [76864/150000]\n",
      "loss: 0.645422  [83264/150000]\n",
      "loss: 0.665367  [89664/150000]\n",
      "loss: 0.623046  [96064/150000]\n",
      "loss: 0.632285  [102464/150000]\n",
      "loss: 0.691932  [108864/150000]\n",
      "loss: 0.686387  [115264/150000]\n",
      "loss: 0.669637  [121664/150000]\n",
      "loss: 0.693980  [128064/150000]\n",
      "loss: 0.640666  [134464/150000]\n",
      "loss: 0.660293  [140864/150000]\n",
      "loss: 0.680868  [147264/150000]\n",
      "Epoch 12\n",
      "-------------------------------\n",
      "loss: 0.587434  [   64/150000]\n",
      "loss: 0.708525  [ 6464/150000]\n",
      "loss: 0.591628  [12864/150000]\n",
      "loss: 0.663720  [19264/150000]\n",
      "loss: 0.684841  [25664/150000]\n",
      "loss: 0.654754  [32064/150000]\n",
      "loss: 0.650320  [38464/150000]\n",
      "loss: 0.702061  [44864/150000]\n",
      "loss: 0.697035  [51264/150000]\n",
      "loss: 0.643511  [57664/150000]\n",
      "loss: 0.619649  [64064/150000]\n",
      "loss: 0.634601  [70464/150000]\n",
      "loss: 0.682273  [76864/150000]\n",
      "loss: 0.697760  [83264/150000]\n",
      "loss: 0.650273  [89664/150000]\n",
      "loss: 0.638562  [96064/150000]\n",
      "loss: 0.659835  [102464/150000]\n",
      "loss: 0.663364  [108864/150000]\n",
      "loss: 0.651951  [115264/150000]\n",
      "loss: 0.648453  [121664/150000]\n",
      "loss: 0.639641  [128064/150000]\n",
      "loss: 0.614400  [134464/150000]\n",
      "loss: 0.684576  [140864/150000]\n",
      "loss: 0.684174  [147264/150000]\n",
      "Epoch 13\n",
      "-------------------------------\n",
      "loss: 0.650435  [   64/150000]\n",
      "loss: 0.663878  [ 6464/150000]\n",
      "loss: 0.625101  [12864/150000]\n",
      "loss: 0.606857  [19264/150000]\n",
      "loss: 0.723722  [25664/150000]\n",
      "loss: 0.636946  [32064/150000]\n",
      "loss: 0.660468  [38464/150000]\n",
      "loss: 0.674337  [44864/150000]\n",
      "loss: 0.674339  [51264/150000]\n",
      "loss: 0.630551  [57664/150000]\n",
      "loss: 0.613187  [64064/150000]\n",
      "loss: 0.624755  [70464/150000]\n",
      "loss: 0.679102  [76864/150000]\n",
      "loss: 0.677289  [83264/150000]\n",
      "loss: 0.635944  [89664/150000]\n",
      "loss: 0.653948  [96064/150000]\n",
      "loss: 0.661237  [102464/150000]\n",
      "loss: 0.662868  [108864/150000]\n",
      "loss: 0.605579  [115264/150000]\n",
      "loss: 0.586815  [121664/150000]\n",
      "loss: 0.666699  [128064/150000]\n",
      "loss: 0.673481  [134464/150000]\n",
      "loss: 0.635239  [140864/150000]\n",
      "loss: 0.645039  [147264/150000]\n",
      "Epoch 14\n",
      "-------------------------------\n",
      "loss: 0.668090  [   64/150000]\n",
      "loss: 0.599687  [ 6464/150000]\n",
      "loss: 0.629408  [12864/150000]\n",
      "loss: 0.651399  [19264/150000]\n",
      "loss: 0.654727  [25664/150000]\n",
      "loss: 0.664350  [32064/150000]\n",
      "loss: 0.664686  [38464/150000]\n",
      "loss: 0.679783  [44864/150000]\n",
      "loss: 0.604046  [51264/150000]\n",
      "loss: 0.721832  [57664/150000]\n",
      "loss: 0.674898  [64064/150000]\n",
      "loss: 0.679042  [70464/150000]\n",
      "loss: 0.607135  [76864/150000]\n",
      "loss: 0.683686  [83264/150000]\n",
      "loss: 0.661300  [89664/150000]\n",
      "loss: 0.686962  [96064/150000]\n",
      "loss: 0.645068  [102464/150000]\n",
      "loss: 0.610484  [108864/150000]\n",
      "loss: 0.632561  [115264/150000]\n",
      "loss: 0.673914  [121664/150000]\n",
      "loss: 0.652598  [128064/150000]\n",
      "loss: 0.675977  [134464/150000]\n",
      "loss: 0.737135  [140864/150000]\n",
      "loss: 0.738202  [147264/150000]\n",
      "Epoch 15\n",
      "-------------------------------\n",
      "loss: 0.615066  [   64/150000]\n",
      "loss: 0.633712  [ 6464/150000]\n",
      "loss: 0.638068  [12864/150000]\n",
      "loss: 0.624230  [19264/150000]\n",
      "loss: 0.656521  [25664/150000]\n",
      "loss: 0.646773  [32064/150000]\n",
      "loss: 0.662515  [38464/150000]\n",
      "loss: 0.672960  [44864/150000]\n",
      "loss: 0.658658  [51264/150000]\n",
      "loss: 0.657518  [57664/150000]\n",
      "loss: 0.700200  [64064/150000]\n",
      "loss: 0.597624  [70464/150000]\n",
      "loss: 0.666552  [76864/150000]\n",
      "loss: 0.678857  [83264/150000]\n",
      "loss: 0.644782  [89664/150000]\n",
      "loss: 0.641724  [96064/150000]\n",
      "loss: 0.680564  [102464/150000]\n",
      "loss: 0.694760  [108864/150000]\n",
      "loss: 0.669231  [115264/150000]\n",
      "loss: 0.634676  [121664/150000]\n",
      "loss: 0.656336  [128064/150000]\n",
      "loss: 0.726409  [134464/150000]\n",
      "loss: 0.628482  [140864/150000]\n",
      "loss: 0.633943  [147264/150000]\n",
      "Epoch 16\n",
      "-------------------------------\n",
      "loss: 0.647609  [   64/150000]\n",
      "loss: 0.623235  [ 6464/150000]\n",
      "loss: 0.639039  [12864/150000]\n",
      "loss: 0.652904  [19264/150000]\n",
      "loss: 0.669995  [25664/150000]\n",
      "loss: 0.623893  [32064/150000]\n",
      "loss: 0.667504  [38464/150000]\n",
      "loss: 0.676849  [44864/150000]\n",
      "loss: 0.656180  [51264/150000]\n",
      "loss: 0.680383  [57664/150000]\n",
      "loss: 0.616005  [64064/150000]\n",
      "loss: 0.690485  [70464/150000]\n",
      "loss: 0.647190  [76864/150000]\n",
      "loss: 0.653215  [83264/150000]\n",
      "loss: 0.648679  [89664/150000]\n",
      "loss: 0.708235  [96064/150000]\n",
      "loss: 0.719220  [102464/150000]\n",
      "loss: 0.600043  [108864/150000]\n",
      "loss: 0.673964  [115264/150000]\n",
      "loss: 0.685269  [121664/150000]\n",
      "loss: 0.647940  [128064/150000]\n",
      "loss: 0.656195  [134464/150000]\n",
      "loss: 0.650605  [140864/150000]\n",
      "loss: 0.641168  [147264/150000]\n",
      "Epoch 17\n",
      "-------------------------------\n",
      "loss: 0.653214  [   64/150000]\n",
      "loss: 0.636936  [ 6464/150000]\n",
      "loss: 0.636615  [12864/150000]\n",
      "loss: 0.648974  [19264/150000]\n",
      "loss: 0.658540  [25664/150000]\n",
      "loss: 0.645894  [32064/150000]\n",
      "loss: 0.639961  [38464/150000]\n",
      "loss: 0.642856  [44864/150000]\n",
      "loss: 0.716866  [51264/150000]\n",
      "loss: 0.604762  [57664/150000]\n",
      "loss: 0.740280  [64064/150000]\n",
      "loss: 0.720662  [70464/150000]\n",
      "loss: 0.630637  [76864/150000]\n",
      "loss: 0.649763  [83264/150000]\n",
      "loss: 0.700698  [89664/150000]\n",
      "loss: 0.630207  [96064/150000]\n",
      "loss: 0.663281  [102464/150000]\n",
      "loss: 0.618110  [108864/150000]\n",
      "loss: 0.627202  [115264/150000]\n",
      "loss: 0.657740  [121664/150000]\n",
      "loss: 0.676660  [128064/150000]\n",
      "loss: 0.621264  [134464/150000]\n",
      "loss: 0.681716  [140864/150000]\n",
      "loss: 0.648704  [147264/150000]\n",
      "Epoch 18\n",
      "-------------------------------\n",
      "loss: 0.618002  [   64/150000]\n",
      "loss: 0.763212  [ 6464/150000]\n",
      "loss: 0.596817  [12864/150000]\n",
      "loss: 0.605093  [19264/150000]\n",
      "loss: 0.680505  [25664/150000]\n",
      "loss: 0.621870  [32064/150000]\n",
      "loss: 0.689686  [38464/150000]\n",
      "loss: 0.637712  [44864/150000]\n",
      "loss: 0.668703  [51264/150000]\n",
      "loss: 0.687299  [57664/150000]\n",
      "loss: 0.633141  [64064/150000]\n",
      "loss: 0.633549  [70464/150000]\n",
      "loss: 0.599067  [76864/150000]\n",
      "loss: 0.599349  [83264/150000]\n",
      "loss: 0.649482  [89664/150000]\n",
      "loss: 0.739377  [96064/150000]\n",
      "loss: 0.598675  [102464/150000]\n",
      "loss: 0.694858  [108864/150000]\n",
      "loss: 0.630123  [115264/150000]\n",
      "loss: 0.623286  [121664/150000]\n",
      "loss: 0.635665  [128064/150000]\n",
      "loss: 0.639139  [134464/150000]\n",
      "loss: 0.623809  [140864/150000]\n",
      "loss: 0.666641  [147264/150000]\n",
      "Epoch 19\n",
      "-------------------------------\n",
      "loss: 0.635846  [   64/150000]\n",
      "loss: 0.666156  [ 6464/150000]\n",
      "loss: 0.698633  [12864/150000]\n",
      "loss: 0.655557  [19264/150000]\n",
      "loss: 0.598991  [25664/150000]\n",
      "loss: 0.689573  [32064/150000]\n",
      "loss: 0.636158  [38464/150000]\n",
      "loss: 0.641736  [44864/150000]\n",
      "loss: 0.664727  [51264/150000]\n",
      "loss: 0.701952  [57664/150000]\n",
      "loss: 0.680570  [64064/150000]\n",
      "loss: 0.648883  [70464/150000]\n",
      "loss: 0.625660  [76864/150000]\n",
      "loss: 0.694573  [83264/150000]\n",
      "loss: 0.713230  [89664/150000]\n",
      "loss: 0.670952  [96064/150000]\n",
      "loss: 0.727192  [102464/150000]\n",
      "loss: 0.647849  [108864/150000]\n",
      "loss: 0.661717  [115264/150000]\n",
      "loss: 0.654119  [121664/150000]\n",
      "loss: 0.633478  [128064/150000]\n",
      "loss: 0.705323  [134464/150000]\n",
      "loss: 0.672897  [140864/150000]\n",
      "loss: 0.600120  [147264/150000]\n",
      "Epoch 20\n",
      "-------------------------------\n",
      "loss: 0.644546  [   64/150000]\n",
      "loss: 0.640478  [ 6464/150000]\n",
      "loss: 0.633345  [12864/150000]\n",
      "loss: 0.616118  [19264/150000]\n",
      "loss: 0.631335  [25664/150000]\n",
      "loss: 0.673348  [32064/150000]\n",
      "loss: 0.624855  [38464/150000]\n",
      "loss: 0.656413  [44864/150000]\n",
      "loss: 0.614320  [51264/150000]\n",
      "loss: 0.659978  [57664/150000]\n",
      "loss: 0.672457  [64064/150000]\n",
      "loss: 0.689187  [70464/150000]\n",
      "loss: 0.625822  [76864/150000]\n",
      "loss: 0.676261  [83264/150000]\n",
      "loss: 0.642124  [89664/150000]\n",
      "loss: 0.704320  [96064/150000]\n",
      "loss: 0.692335  [102464/150000]\n",
      "loss: 0.636632  [108864/150000]\n",
      "loss: 0.660210  [115264/150000]\n",
      "loss: 0.632034  [121664/150000]\n",
      "loss: 0.645695  [128064/150000]\n",
      "loss: 0.659339  [134464/150000]\n",
      "loss: 0.666990  [140864/150000]\n",
      "loss: 0.643661  [147264/150000]\n",
      "Epoch 21\n",
      "-------------------------------\n",
      "loss: 0.595792  [   64/150000]\n",
      "loss: 0.707258  [ 6464/150000]\n",
      "loss: 0.683403  [12864/150000]\n",
      "loss: 0.665520  [19264/150000]\n",
      "loss: 0.613190  [25664/150000]\n",
      "loss: 0.647088  [32064/150000]\n",
      "loss: 0.654385  [38464/150000]\n",
      "loss: 0.598912  [44864/150000]\n",
      "loss: 0.608761  [51264/150000]\n",
      "loss: 0.642667  [57664/150000]\n",
      "loss: 0.704980  [64064/150000]\n",
      "loss: 0.583899  [70464/150000]\n",
      "loss: 0.639745  [76864/150000]\n",
      "loss: 0.641732  [83264/150000]\n",
      "loss: 0.650332  [89664/150000]\n",
      "loss: 0.629436  [96064/150000]\n",
      "loss: 0.636924  [102464/150000]\n",
      "loss: 0.646882  [108864/150000]\n",
      "loss: 0.698254  [115264/150000]\n",
      "loss: 0.642583  [121664/150000]\n",
      "loss: 0.615423  [128064/150000]\n",
      "loss: 0.708793  [134464/150000]\n",
      "loss: 0.699075  [140864/150000]\n",
      "loss: 0.726940  [147264/150000]\n",
      "Epoch 22\n",
      "-------------------------------\n",
      "loss: 0.652566  [   64/150000]\n",
      "loss: 0.651023  [ 6464/150000]\n",
      "loss: 0.671694  [12864/150000]\n",
      "loss: 0.650496  [19264/150000]\n",
      "loss: 0.681427  [25664/150000]\n",
      "loss: 0.623721  [32064/150000]\n",
      "loss: 0.648151  [38464/150000]\n",
      "loss: 0.709970  [44864/150000]\n",
      "loss: 0.640871  [51264/150000]\n",
      "loss: 0.662720  [57664/150000]\n",
      "loss: 0.604303  [64064/150000]\n",
      "loss: 0.604322  [70464/150000]\n",
      "loss: 0.672966  [76864/150000]\n",
      "loss: 0.629765  [83264/150000]\n",
      "loss: 0.672636  [89664/150000]\n",
      "loss: 0.652548  [96064/150000]\n",
      "loss: 0.692534  [102464/150000]\n",
      "loss: 0.644159  [108864/150000]\n",
      "loss: 0.677667  [115264/150000]\n",
      "loss: 0.676831  [121664/150000]\n",
      "loss: 0.631420  [128064/150000]\n",
      "loss: 0.661244  [134464/150000]\n",
      "loss: 0.641716  [140864/150000]\n",
      "loss: 0.722119  [147264/150000]\n",
      "Epoch 23\n",
      "-------------------------------\n",
      "loss: 0.663469  [   64/150000]\n",
      "loss: 0.668192  [ 6464/150000]\n",
      "loss: 0.654821  [12864/150000]\n",
      "loss: 0.660633  [19264/150000]\n",
      "loss: 0.693761  [25664/150000]\n",
      "loss: 0.755460  [32064/150000]\n",
      "loss: 0.638021  [38464/150000]\n",
      "loss: 0.679599  [44864/150000]\n",
      "loss: 0.598877  [51264/150000]\n",
      "loss: 0.659402  [57664/150000]\n",
      "loss: 0.693250  [64064/150000]\n",
      "loss: 0.626010  [70464/150000]\n",
      "loss: 0.670405  [76864/150000]\n",
      "loss: 0.698905  [83264/150000]\n",
      "loss: 0.632130  [89664/150000]\n",
      "loss: 0.630358  [96064/150000]\n",
      "loss: 0.641871  [102464/150000]\n",
      "loss: 0.722717  [108864/150000]\n",
      "loss: 0.580917  [115264/150000]\n",
      "loss: 0.652965  [121664/150000]\n",
      "loss: 0.603307  [128064/150000]\n",
      "loss: 0.711084  [134464/150000]\n",
      "loss: 0.635003  [140864/150000]\n",
      "loss: 0.713117  [147264/150000]\n",
      "Epoch 24\n",
      "-------------------------------\n",
      "loss: 0.646137  [   64/150000]\n",
      "loss: 0.641731  [ 6464/150000]\n",
      "loss: 0.673132  [12864/150000]\n",
      "loss: 0.628439  [19264/150000]\n",
      "loss: 0.669080  [25664/150000]\n",
      "loss: 0.640892  [32064/150000]\n",
      "loss: 0.665428  [38464/150000]\n",
      "loss: 0.630261  [44864/150000]\n",
      "loss: 0.664055  [51264/150000]\n",
      "loss: 0.680594  [57664/150000]\n",
      "loss: 0.607228  [64064/150000]\n",
      "loss: 0.639457  [70464/150000]\n",
      "loss: 0.649519  [76864/150000]\n",
      "loss: 0.575888  [83264/150000]\n",
      "loss: 0.594832  [89664/150000]\n",
      "loss: 0.689152  [96064/150000]\n",
      "loss: 0.656510  [102464/150000]\n",
      "loss: 0.615581  [108864/150000]\n",
      "loss: 0.628312  [115264/150000]\n",
      "loss: 0.660324  [121664/150000]\n",
      "loss: 0.693586  [128064/150000]\n",
      "loss: 0.694582  [134464/150000]\n",
      "loss: 0.623774  [140864/150000]\n",
      "loss: 0.627775  [147264/150000]\n",
      "Epoch 25\n",
      "-------------------------------\n",
      "loss: 0.649402  [   64/150000]\n",
      "loss: 0.640326  [ 6464/150000]\n",
      "loss: 0.697259  [12864/150000]\n",
      "loss: 0.630384  [19264/150000]\n",
      "loss: 0.601615  [25664/150000]\n",
      "loss: 0.702772  [32064/150000]\n",
      "loss: 0.609604  [38464/150000]\n",
      "loss: 0.647850  [44864/150000]\n",
      "loss: 0.651816  [51264/150000]\n",
      "loss: 0.665643  [57664/150000]\n",
      "loss: 0.620236  [64064/150000]\n",
      "loss: 0.654356  [70464/150000]\n",
      "loss: 0.707897  [76864/150000]\n",
      "loss: 0.722696  [83264/150000]\n",
      "loss: 0.603134  [89664/150000]\n",
      "loss: 0.637506  [96064/150000]\n",
      "loss: 0.643881  [102464/150000]\n",
      "loss: 0.667857  [108864/150000]\n",
      "loss: 0.633764  [115264/150000]\n",
      "loss: 0.628515  [121664/150000]\n",
      "loss: 0.703831  [128064/150000]\n",
      "loss: 0.674163  [134464/150000]\n",
      "loss: 0.715996  [140864/150000]\n",
      "loss: 0.707028  [147264/150000]\n",
      "Epoch 26\n",
      "-------------------------------\n",
      "loss: 0.595960  [   64/150000]\n",
      "loss: 0.670054  [ 6464/150000]\n",
      "loss: 0.669171  [12864/150000]\n",
      "loss: 0.684622  [19264/150000]\n",
      "loss: 0.691602  [25664/150000]\n",
      "loss: 0.653628  [32064/150000]\n",
      "loss: 0.630143  [38464/150000]\n",
      "loss: 0.658746  [44864/150000]\n",
      "loss: 0.638797  [51264/150000]\n",
      "loss: 0.632856  [57664/150000]\n",
      "loss: 0.655423  [64064/150000]\n",
      "loss: 0.661142  [70464/150000]\n",
      "loss: 0.650285  [76864/150000]\n",
      "loss: 0.663294  [83264/150000]\n",
      "loss: 0.661667  [89664/150000]\n",
      "loss: 0.675809  [96064/150000]\n",
      "loss: 0.670255  [102464/150000]\n",
      "loss: 0.636772  [108864/150000]\n",
      "loss: 0.658957  [115264/150000]\n",
      "loss: 0.695293  [121664/150000]\n",
      "loss: 0.669287  [128064/150000]\n",
      "loss: 0.711541  [134464/150000]\n",
      "loss: 0.614966  [140864/150000]\n",
      "loss: 0.679421  [147264/150000]\n",
      "Epoch 27\n",
      "-------------------------------\n",
      "loss: 0.659212  [   64/150000]\n",
      "loss: 0.644523  [ 6464/150000]\n",
      "loss: 0.681561  [12864/150000]\n",
      "loss: 0.682237  [19264/150000]\n",
      "loss: 0.713173  [25664/150000]\n",
      "loss: 0.681911  [32064/150000]\n",
      "loss: 0.684233  [38464/150000]\n",
      "loss: 0.678173  [44864/150000]\n",
      "loss: 0.665932  [51264/150000]\n",
      "loss: 0.617987  [57664/150000]\n",
      "loss: 0.686977  [64064/150000]\n",
      "loss: 0.611025  [70464/150000]\n",
      "loss: 0.666089  [76864/150000]\n",
      "loss: 0.741182  [83264/150000]\n",
      "loss: 0.681186  [89664/150000]\n",
      "loss: 0.653870  [96064/150000]\n",
      "loss: 0.684702  [102464/150000]\n",
      "loss: 0.672481  [108864/150000]\n",
      "loss: 0.637371  [115264/150000]\n",
      "loss: 0.685041  [121664/150000]\n",
      "loss: 0.629310  [128064/150000]\n",
      "loss: 0.668958  [134464/150000]\n",
      "loss: 0.621565  [140864/150000]\n",
      "loss: 0.675835  [147264/150000]\n",
      "Epoch 28\n",
      "-------------------------------\n",
      "loss: 0.680113  [   64/150000]\n",
      "loss: 0.628885  [ 6464/150000]\n",
      "loss: 0.663909  [12864/150000]\n",
      "loss: 0.594170  [19264/150000]\n",
      "loss: 0.605350  [25664/150000]\n",
      "loss: 0.607109  [32064/150000]\n",
      "loss: 0.660588  [38464/150000]\n",
      "loss: 0.550444  [44864/150000]\n",
      "loss: 0.681684  [51264/150000]\n",
      "loss: 0.665845  [57664/150000]\n",
      "loss: 0.618158  [64064/150000]\n",
      "loss: 0.689006  [70464/150000]\n",
      "loss: 0.617043  [76864/150000]\n",
      "loss: 0.640028  [83264/150000]\n",
      "loss: 0.645341  [89664/150000]\n",
      "loss: 0.646297  [96064/150000]\n",
      "loss: 0.616130  [102464/150000]\n",
      "loss: 0.629553  [108864/150000]\n",
      "loss: 0.620838  [115264/150000]\n",
      "loss: 0.606069  [121664/150000]\n",
      "loss: 0.651063  [128064/150000]\n",
      "loss: 0.663898  [134464/150000]\n",
      "loss: 0.655485  [140864/150000]\n",
      "loss: 0.698743  [147264/150000]\n",
      "Epoch 29\n",
      "-------------------------------\n",
      "loss: 0.599219  [   64/150000]\n",
      "loss: 0.618767  [ 6464/150000]\n",
      "loss: 0.624736  [12864/150000]\n",
      "loss: 0.615250  [19264/150000]\n",
      "loss: 0.662486  [25664/150000]\n",
      "loss: 0.652475  [32064/150000]\n",
      "loss: 0.732747  [38464/150000]\n",
      "loss: 0.687345  [44864/150000]\n",
      "loss: 0.669471  [51264/150000]\n",
      "loss: 0.629389  [57664/150000]\n",
      "loss: 0.671323  [64064/150000]\n",
      "loss: 0.635910  [70464/150000]\n",
      "loss: 0.717396  [76864/150000]\n",
      "loss: 0.666345  [83264/150000]\n",
      "loss: 0.691317  [89664/150000]\n",
      "loss: 0.674420  [96064/150000]\n",
      "loss: 0.677972  [102464/150000]\n",
      "loss: 0.666619  [108864/150000]\n",
      "loss: 0.662298  [115264/150000]\n",
      "loss: 0.642541  [121664/150000]\n",
      "loss: 0.668970  [128064/150000]\n",
      "loss: 0.699222  [134464/150000]\n",
      "loss: 0.637079  [140864/150000]\n",
      "loss: 0.644069  [147264/150000]\n",
      "Epoch 30\n",
      "-------------------------------\n",
      "loss: 0.723001  [   64/150000]\n",
      "loss: 0.654980  [ 6464/150000]\n",
      "loss: 0.678982  [12864/150000]\n",
      "loss: 0.670415  [19264/150000]\n",
      "loss: 0.606242  [25664/150000]\n",
      "loss: 0.694023  [32064/150000]\n",
      "loss: 0.695420  [38464/150000]\n",
      "loss: 0.675982  [44864/150000]\n",
      "loss: 0.664754  [51264/150000]\n",
      "loss: 0.662713  [57664/150000]\n",
      "loss: 0.658120  [64064/150000]\n",
      "loss: 0.685516  [70464/150000]\n",
      "loss: 0.625715  [76864/150000]\n",
      "loss: 0.655096  [83264/150000]\n",
      "loss: 0.651820  [89664/150000]\n",
      "loss: 0.724473  [96064/150000]\n",
      "loss: 0.629525  [102464/150000]\n",
      "loss: 0.671512  [108864/150000]\n",
      "loss: 0.625204  [115264/150000]\n",
      "loss: 0.669190  [121664/150000]\n",
      "loss: 0.644404  [128064/150000]\n",
      "loss: 0.697721  [134464/150000]\n",
      "loss: 0.655393  [140864/150000]\n",
      "loss: 0.634261  [147264/150000]\n",
      "Done!\n",
      "Train data:\n",
      "AUC value is: 0.6286885169831046\n",
      "Accuracy is: 0.6146066666666666\n",
      "Test data:\n",
      "AUC value is: 0.630914174985072\n",
      "Accuracy is: 0.6175\n"
     ]
    }
   ],
   "source": [
    "attack_model = shadow_attack(sha_models=sha_models, tar_model=tar_model, model_num=num_shadowsets, weight_dir=weight_dir, data_name=DATA_NAME, model=MODEL, model_transform=model_transform, \n",
    "                  model_epochs=EPOCHS, batch_size=BATCH_SIZE, learning_rate=attack_lr, attack_epochs=30, attack_transform=attack_transform, \n",
    "                  device=device, prop_keep=0.5, top_k=3, attack_class=attack_class)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "ab8c2490-c230-4516-a19a-df84a3779011",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Attack_NN(\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=3, out_features=128, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=128, out_features=64, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=64, out_features=1, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "attack_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "d1f87436-bae2-410f-a025-e9757ecd17d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "targetX = conf_data_all[tar_model].astype(np.float32)\n",
    "targetY = train_keep[tar_model]\n",
    "# targetX = np.concatenate((targetX, Y_data.reshape(Y_data.shape[0],1)), 1)\n",
    "targetX = targetX.astype(np.float32)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "ebd65e38-9469-4c5f-a5a3-041b675a9d3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "top_k = 3\n",
    "if top_k:\n",
    "    # 仅使用概率向量的前3个值\n",
    "    targetX, _ = get_top_k_conf(top_k, targetX, targetX)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "8ba8d2b7-7d6c-4e17-95bd-f854e8af5af9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC value is: 0.635486153111138\n",
      "Accuracy is: 0.62184\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.62184"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shadow_attack_data = CustomDataset(targetX, targetY, attack_transform)\n",
    "shadow_attack_dataloader = DataLoader(shadow_attack_data, batch_size=batch_size, shuffle=False)\n",
    "attack_test_scores, attack_test_mem = get_attack_pred(shadow_attack_dataloader, attack_model, device)\n",
    "attack_test_scores, attack_test_mem = attack_test_scores.detach().cpu().numpy(), attack_test_mem.detach().cpu().numpy()\n",
    "evaluate_ROC(attack_test_scores, attack_test_mem)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "c8cb250e-ad72-40b3-8967-46b8538be791",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC value is: 0.7700126721278648\n",
      "Accuracy is: 0.7022\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.7022"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluate_ROC(attack_test_scores[risk_rank[:x]], attack_test_mem[risk_rank[:x]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eebaa471-2271-4310-b936-1030edb6f096",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4bbfa8f-bd1a-46f6-9b79-a7c758d30f27",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b077751a-c0ee-4e39-9f70-41b791d348e6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f06a3e24-5a57-472a-b6f0-78961403f471",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "40ceb18e-621c-4c72-8ef7-94498c7b65c5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30abf80e-2b00-4b70-ac0c-a7099f987cc4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f0ae045-14bd-4159-948c-8881f74cd181",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d64311d6-c09d-47b3-8076-f11eb10134aa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "87d308e9-be9d-40fb-be9e-e84efc339052",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0308f234-469f-4670-b4e4-51973cb27ce4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a9b3ad57-7f95-4bc7-8057-05aa0ca4e10a",
   "metadata": {},
   "source": [
    "### 绘制攻击成功率随风险变化曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "adbc5ad1-6ce5-41c5-812a-470cde9d7fae",
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_all = conf_data_all.argmax(2)\n",
    "base_att = (pred_all == Y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "a79890e7-c8ea-4ddd-9e0a-c51831260ad9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 50000)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "base_att.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "18020329-0447-496c-bffa-a59f865df12c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 50000)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_keep.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "67ad94bc-8667-4f2b-ab7b-3d32a98e97d8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000,)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pri_risk_all.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "973858e9-c4fd-47cd-9941-c5730dfff80a",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_axi = []\n",
    "Y_axi = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "32a62f68-5955-4c27-9dd6-ef83565eace3",
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(10000):\n",
    "    pred_t = base_att[:,i]\n",
    "    mem_t = train_keep[:,i]\n",
    "    risk_t = pri_risk_all[i]\n",
    "    acc = metrics.accuracy_score(mem_t, pred_t)\n",
    "    X_axi.append(risk_t)\n",
    "    Y_axi.append(acc)\n",
    "\n",
    "df=pd.DataFrame({'risk': X_axi, 'attack_acc': Y_axi })\n",
    "df.to_csv('CIFAR10_risk_add.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "167a02f3-6421-45a8-ac58-50282fe2dc7c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2ba9c3f-cb50-472a-b7f2-f6c7cc8163ea",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "030de03c-e397-4141-8f84-6cd9910e91a7",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 输入loss_data_all，pri_risk_rank，train_keep，conf_data_all，pri_risk_all\n",
    "\n",
    "for i in range(100): # 对数据下标进行计数\n",
    "    start = i * 500\n",
    "    end = (i+1) * 500\n",
    "    risk_t = pri_risk_all[pri_risk_rank[start:end]]\n",
    "    for j in range(100): # 对目标模型进行计数\n",
    "        pred_temp = base_att[j][pri_risk_rank[start:end]]\n",
    "        mem_temp = train_keep[j][pri_risk_rank[start:end]]\n",
    "        if j==0:\n",
    "            pred_t = pred_temp\n",
    "            mem_t = mem_temp\n",
    "        else:\n",
    "            pred_t = np.concatenate((pred_t, pred_temp), 0)\n",
    "            mem_t = np.concatenate((mem_t, mem_temp), 0)\n",
    "    acc = metrics.accuracy_score(mem_t, pred_t)\n",
    "    risk = np.mean(risk_t)\n",
    "    X_axi.append(risk)\n",
    "    Y_axi.append(acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a4df62ec-4eb6-4c8f-a522-737a9e0d0e06",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "238bf52f-5f07-4176-9642-bd34be61a5a6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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B1cHAMBFhB9ctf2nsjX5651KOpguSYoJC9RLd3TUda3CHFwZAABlEX5wxXILi/XW8v1675eDKjIb8vXy0OP9W2psvxj5ejF/DwDAORF+cEV+2XdaE7/cruMZeZKkm9o21Au3d1BUPQY1AwCcG+EHNks+fFYPz9+oQrNFkaH+euH2Drq5fbijywIAoEocPhJ15syZatasmfz8/BQXF6f169dX2n7GjBlq06aN/P39FRUVpSeffFL5+fk1VC2OZ+TpTx+WBJ/4dg21LKEfwQcA4FJsDj+jRo3SypUr7fLhCxYsUEJCgqZOnapNmzapS5cuGjhwoE6dOlVu+08++UQTJ07U1KlTtXv3bs2ZM0cLFizQ3/72N7vUg8rlFhZr7PsblXauUG0jgvTGvd0U4EPnIQDAtdgcfjIzMxUfH69WrVrp5Zdf1vHjx6/4w6dPn66xY8dq9OjRat++vWbPnq2AgADNnTu33PZr1qxRnz59dN9996lZs2YaMGCAhg8fftneIlw9i8XQU59v1a6TWaof6KP3RnVXoC/BBwDgemwOP19//bWOHz+uRx99VAsWLFCzZs00aNAgffHFFyoqKqrydgoLC5WcnKz4+PiLxXh4KD4+XklJSeWu07t3byUnJ1vDzsGDB/X999/r1ltvrfBzCgoKlJWVVeoF272RuE//tyNF3p4mzX4gVk3qMrAZAOCarmjMT4MGDZSQkKCtW7dq3bp1atmypR544AE1btxYTz75pPbt23fZbaSlpclsNis8vPR4kfDwcKWkpJS7zn333aeXXnpJ1113nby9vdWiRQvdcMMNlV72mjZtmkJCQqyvqKgo23YW+t+2E3ojseSY/r8hnXQtz+cCALiwqxrwfPLkSS1btkzLli2Tp6enbr31Vm3fvl3t27fX66+/bq8arVasWKGXX35Z//3vf7Vp0yYtWrRIixcv1t///vcK15k0aZIyMzOtr6NHj9q9rtpsx/FM/XXhVknSmOua655rCY8AANdm86CNoqIiffvtt5o3b56WLl2qzp0764knntB9992n4OBgSdJXX32lhx56SE8++WSF2wkLC5Onp6dSU1NLLU9NTVVERES560yePFkPPPCAxowZI0nq1KmTcnJy9Mgjj+i5556Th0fZLOfr6ytfX19bdxOSTmXla+wHG5VfZNH1rRto0q3tHF0SAABXzebw06hR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8wPAZjfccIPGjx+v8ePHKyQkRGFhYZo8ebIufVRgs2bN9Pe//10jR45UcHCwHnnkkVKXvSwWi5o0aaJZs2aV2vbmzZvl4eGhw4cPS5KmT5+uTp06KTAwUFFRUXrsscd07ty5UuusXr1aN9xwgwICAlS3bl0NHDhQZ8+e1QcffKD69euroKCgVPshQ4bogQceKHffLtS4YMECXX/99fLz89PHH39c5lLW1q1bdeONNyooKEjBwcGKjY3Vxo0by93m6dOn1b17d915551lagFQ8wg/AK7I+++/Ly8vL61fv15vvPGGpk+frvfee69Um3//+9/q0qWLNm/erMmTJ5d6z8PDQ8OHD9cnn3xSavnHH3+sPn36KDo62truzTff1M6dO/X+++9r+fLleuaZZ6ztt2zZoptuuknt27dXUlKSVq1apcGDB8tsNuvuu++W2WzWt99+a21/6tQpLV68WA899FCl+zdx4kRNmDBBu3fv1sCBA8u8P2LECDVp0kQbNmxQcnKyJk6cKG9v7zLtjh49qr59+6pjx4764osv5OvrW+nnAqgBV/ysegBu6/rrrzfatWtnWCwW67Jnn33WaNeunfXn6OhoY8iQIaXWO3TokCHJ2Lx5s2EYhrF582bDZDIZhw8fNgzDMMxmsxEZGWnMmjWrws9euHChUb9+fevPw4cPN/r06VNh+0cffdQYNGiQ9efXXnvNiImJKVV7eTXOmDGj1PJ58+YZISEh1p+DgoKM+fPnl7uNC2337NljREVFGX/5y18q/DwANY+eHwBXpGfPnjKZTNafe/XqpX379slsNluXde/evdJtdO3aVe3atbP2/vz88886deqU7r77bmubH3/8UTfddJMiIyMVFBSkBx54QOnp6crNzZV0seenImPHjtXSpUt1/PhxSSV3Yj344IOlai/P5WpPSEjQmDFjFB8fr3/+8586cOBAqffz8vLUt29fDR06VG+88cZlPw9AzSH8AKg2gYGBl20zYsQIa/j55JNPdMstt6h+/fqSSsbf/OEPf1Dnzp315ZdfKjk5WTNnzpRUMoBa0mUHIXfr1k1dunTRBx98oOTkZO3cuVMPPvjgVdf+wgsvaOfOnbrtttu0fPlytW/fXl999ZX1fV9fX8XHx+t///ufNXgBcA6EHwBXZN26daV+Xrt2rVq1aiVPT0+btnPfffdpx44dSk5O1hdffKERI0ZY30tOTpbFYtFrr72mnj17qnXr1jpx4kSp9Tt37qzExMRKP2PMmDGaP3++5s2bp/j4eEVFRdlUY0Vat26tJ598UkuXLtXQoUM1b94863seHh768MMPFRsbqxtvvLFM3QAch/AD4IocOXJECQkJ2rt3rz799FO99dZbmjBhgs3badasmXr37q2HH35YZrNZt99+u/W9li1bqqioSG+99ZYOHjyoDz/8ULNnzy61/qRJk7RhwwY99thj2rZtm/bs2aNZs2YpLS3N2ua+++7TsWPH9O677152oHNV5OXlafz48VqxYoUOHz6s1atXa8OGDWrXrl2pdp6envr444/VpUsX9e/fXykpKVf92QCuHuEHwBUZOXKk8vLy1KNHD40bN04TJkzQI488ckXbGjFihLZu3ao777yz1GWsLl26aPr06XrllVfUsWNHffzxx5o2bVqpdVu3bq2lS5dq69at6tGjh3r16qVvvvlGXl4XpzELCQnRXXfdpTp16mjIkCFXVOOlPD09lZ6erpEjR6p169a65557NGjQIL344otl2np5eenTTz9Vhw4d1L9/f506deqqPx/A1TEZxiUTcwBAFdxwww3q2rWrZsyY4ehSquymm25Shw4d9Oabbzq6FAAOxgzPAGq1s2fPasWKFVqxYoX++9//OrocAE6A8AOgVuvWrZvOnj2rV155RW3atHF0OQCcAJe9AACAW2HAMwAAcCuEHwAA4FYIPwAAwK0QfgAAgFsh/AAAALdC+AEAAG6F8AMAANwK4QcAALiV/w+aIdaL3oII1AAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "df=pd.DataFrame({'xvalues': X_axi, 'yvalues': Y_axi })\n",
    " \n",
    "# plot\n",
    "plt.plot( 'xvalues', 'yvalues', data=df)\n",
    "plt.xlabel(\"privacy risk\")\n",
    "plt.ylabel(\"attack accuracy\")\n",
    "# show the graph\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ee4f5ad-e959-4f63-bde3-78c7e25fc0e4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "48d74a89-2c75-453a-a3b2-3fd906337030",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "025ed341-77fd-4f0e-b2cf-1ac59f0e74af",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "8e1a4ee1-0c47-411a-b98b-d7713d949e09",
   "metadata": {},
   "source": [
    "### 绘制损失分布差异"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "ecd477a2-9df6-4a4a-ba78-716c2d669d45",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "2abddba4-ae48-405a-beb5-c45daf231d6d",
   "metadata": {},
   "outputs": [],
   "source": [
    "idx = 31000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "0421a068-0678-435b-86b7-9f37862cc816",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 需要使用loss_data_all，pri_risk_rank，train_keep\n",
    "dat_in = []\n",
    "dat_out = []\n",
    "for i in range(loss_data_all.shape[1]):\n",
    "    dat_in.append((loss_data_all[train_keep[:,i],i]))\n",
    "    dat_out.append((loss_data_all[~train_keep[:,i],i]))\n",
    "dat_in = np.array(dat_in)\n",
    "dat_out = np.array(dat_out)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "37c2030e-d91f-4fdf-9a5a-e246ca594916",
   "metadata": {},
   "outputs": [],
   "source": [
    "mem1 = dat_in[pri_risk_rank[idx]]\n",
    "non_mem1 = dat_out[pri_risk_rank[idx]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "5612c786-26df-4ff0-9c42-2af62fa46b0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "mem1 = mem1.reshape(mem1.shape[0], 1)\n",
    "non_mem1 = non_mem1.reshape(non_mem1.shape[0], 1)\n",
    "\n",
    "arr = np.concatenate((mem1, non_mem1), 1)\n",
    "\n",
    "df = pd.DataFrame(arr, columns=['loss','out'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "5a3fd823-c33a-4c78-8829-e7bb6410bc02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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J07Uzp07lZOTY/dojsI7Moja+++/r9TUVF133XWSpEGDBhExhjt06JA++OADzZ492+5REAPDhw9XSUmJJGnYsGHKzc3V6dOn7R0K3bZ7926NGzdOI0eOVP/+/TV79mz913/9l91jOQ4h04dt375dN910k0aMGCGXy6VNmzZdcJ81a9aooKBAbrdbU6ZM0e7du7v9/IcOHVL//v110003acKECXr00UdjOD0+L977U5LuueceVVZWxmhiXEwi9mmbvXv3KhQKKS8vr5dTo7t6u3+PHz+ukSNHRq6PHDlSx44dS8ToRiFk+rDGxkZdddVVWrNmTYe3v/jiiyorK9Py5cv1zjvv6KqrrtKsWbNUV1cXuU9JSYmuuOKKCy7Hjx9Xa2ur/vSnP+mpp57Srl27tHXrVm3dujVRm3fJiff+/P3vf6+xY8dq7NixidqkS16892mb06dP69vf/rbWrVsX923C/4vF/kU3WLgkSLJefvnldstKS0utxYsXR66HQiFrxIgRVmVlZbeec+fOndbMmTMj11etWmWtWrUqJvOia/HYn/fff7912WWXWaNGjbJycnKsrKwsa8WKFbEcG12Ixz61LMtqamqyrrvuOuvXv/51rEZFFKLZvzt27LDmzp0buf2uu+6ynn/++YTMaxLekblEnT9/Xnv37tWMGTMiy5KSkjRjxgzt2rWrW88xefJk1dXV6cyZMwqHw9q+fbu8Xm+8RkYXYrE/KysrdfToUR05ckQ///nPtXDhQj300EPxGhkXEYt9almWbr/9dn35y1/WbbfdFq9REYXu7N/S0lLt379fx44d07lz5/Taa69p1qxZdo3sWITMJcrv9ysUCl3wW8SHDh2qkydPdus5UlJS9Oijj+r666/X+PHjNWbMGM2ZMyce4+IiYrE/4Syx2Kc7duzQiy++qE2bNqmkpEQlJSV677334jEueqg7+zclJUWPPfaYpk+frpKSEv3whz/kE0sd4CMm6JXZs2fzCZc+6Pbbb7d7BMTAF7/4RYXDYbvHQC987Wtf09e+9jW7x3A03pG5ROXm5io5OVmnTp1qt/zUqVMaNmyYTVMhWuzPvod92rexf2OHkLlEpaWlaeLEiaquro4sC4fDqq6u1jXXXGPjZIgG+7PvYZ/2bezf2OHQUh927tw5HT58OHK9pqZG+/bt06BBg5Sfn6+ysjLNnz9fkyZNUmlpqaqqqtTY2KgFCxbYODU6w/7se9infRv7N0Hs/tgU4mfbtm2WpAsu8+fPj9znySeftPLz8620tDSrtLTUevPNN+0bGF1if/Y97NO+jf2bGPyuJQAAYCzOkQEAAMYiZAAAgLEIGQAAYCxCBgAAGIuQAQAAxiJkAACAsQgZAABgLEIGAAAYi5AB4CjTpk3T0qVL7R4DgCEIGQAAYCxCBgAAGIuQAeBYZ86c0be//W0NHDhQHo9Hs2fP1qFDhyK3f/zxx7rppps0cOBA9evXT+PGjdPmzZsjj7311ls1ePBgZWRkaMyYMXrmmWfs2hQAcZJi9wAA0Jnbb79dhw4d0iuvvKKsrCzdd999uvHGG3XgwAGlpqZq8eLFOn/+vLZv365+/frpwIED6t+/vySpoqJCBw4c0Guvvabc3FwdPnxYn376qc1bBCDWCBkAjtQWMDt27NC1114rSXr++eeVl5enTZs26Zvf/KZqa2v1jW98Q1deeaUk6fLLL488vra2VldffbUmTZokSSooKEj4NgCIPw4tAXAkn8+nlJQUTZkyJbIsJydHRUVF8vl8kqQlS5bokUce0dSpU7V8+XK9++67kfsuWrRIGzduVElJie69917t3Lkz4dsAIP4IGQDG+u53v6uPPvpIt912m9577z1NmjRJTz75pCRp9uzZ+vjjj3X33Xfr+PHjuuGGG3TPPffYPDGAWCNkADiS1+tVa2ur3nrrrciyTz75RAcPHlRxcXFkWV5env7lX/5FL730kn74wx9q/fr1kdsGDx6s+fPn67nnnlNVVZXWrVuX0G0AEH+cIwPAkcaMGaObb75ZCxcu1C9/+UtlZmbq/vvv18iRI3XzzTdLkpYuXarZs2dr7NixOnPmjLZt2yav1ytJeuihhzRx4kSNGzdOzc3NevXVVyO3Aeg7eEcGgGM988wzmjhxoubMmaNrrrlGlmVp8+bNSk1NlSSFQiEtXrxYXq9XX/nKVzR27Fg99dRTkqS0tDSVl5dr/Pjxuv7665WcnKyNGzfauTkA4sBlWZZl9xAAAADR4B0ZAABgLEIGAAAYi5ABAADGImQAAICxCBkAAGAsQgYAABiLkAEAAMYiZAAAgLEIGQAAYCxCBgAAGIuQAQAAxiJkAACAsf4PQCpQwnVN9OIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "  \n",
    "\n",
    "sns.histplot(data=df, x=\"loss\", color=\"blue\", label=\"in\", log_scale=True)\n",
    "sns.histplot(data=df, x=\"out\", color=\"red\", label=\"out\", log_scale=True)\n",
    "\n",
    "plt.legend() \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05bd3cc7-e9f6-438b-9e72-7a67d682b590",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "3501d38f-7388-44cb-8b49-3c03c82ab8c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def imshow(img):\n",
    "    img = img\n",
    "    npimg = img\n",
    "    plt.imshow(npimg)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "94652e56-d847-4409-89fa-99e1b48e52d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "imshow(X_data[pri_risk_rank[idx]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "9a280b28-71e2-4ac0-be7a-cab54c5af113",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y_data[pri_risk_rank[idx]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63075866-0819-4386-8e3d-ee79a873b1fd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "90e6dd21-dd7a-4184-b9ae-d90c0a54e1ef",
   "metadata": {},
   "source": [
    "### 提取几个易受攻击的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "0561788b-87e6-45c8-af68-67db0840327e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([37135, 41914, 18310, ..., 36986, 36985, 31723])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pri_risk_rank"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "2a3178b6-d970-435d-ba34-aacac772a1d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "21127"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pri_risk_rank[6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "047a0685-e75b-426d-8ddc-0af8c1ea81ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "dat_in = []\n",
    "dat_out = []\n",
    "for i in range(conf_data_all.shape[1]):\n",
    "    dat_in.append((conf_data_all[train_keep[:,i],i]))\n",
    "    dat_out.append((conf_data_all[~train_keep[:,i],i]))\n",
    "dat_in = np.array(dat_in)\n",
    "dat_out = np.array(dat_out)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "b4054ed9-89d5-4e78-b7cf-3a4c1ff88ea0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000, 50, 10)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dat_in.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "96fdb6dd-4d0a-44d7-801d-1de9bb33ceaf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000, 50, 10)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dat_out.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "038eccab-cc3c-4d29-8bc0-3d02ca44b058",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3 4 6 7 9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "77510917-736b-4e19-94bf-592d5b8c3d90",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数字标签为： 5\n",
      "成员表现 [1.08991168e-14 1.56603064e-18 4.56265958e-09 1.28926782e-11\n",
      " 2.56505655e-06 9.99838114e-01 4.21772706e-20 1.59244883e-04\n",
      " 1.94658097e-16 9.89917559e-16]\n",
      "非成员表现 [2.58288641e-27 1.37516078e-27 2.58565394e-29 1.26392263e-27\n",
      " 5.58264237e-14 1.35318212e-24 7.20615414e-34 1.00000000e+00\n",
      " 5.91054298e-29 2.13286073e-25]\n"
     ]
    },
    {
     "data": {
      "image/png": "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ZtY515aX22J++nKBc+3vXnePPpKksqR7LFByWr2pd3+/+zkrSflht2gTScrm3feJJA0azq0jh90jgSQpF3ZfS0ntLFPvoXitc+27g7aIp8MHf2eqP9a9z7k2Gbf93v9HH/9j59q6iy419a6siDvXduz/tXNtZsgtmohHQAAALxhAAAAvGEAAAC8YQAAALxhAAAAvGEAAAC8YQAAALxhAAAAvGEAAAC8YQAAALxhAAAAvLtgsuJ88+U8KhRznY9gtM06SLqqbblpHKlpwro3LljdV13iRc+1Qd6epd0/vEefat17bYeodKdiyxmZMWelcW1Lino8nSUNpt8yp93qXmnqn033Ote2v7zH1HswOmuory90zuyJl1bbeOffa/PCwqXc2l3GuLUm6b6MkXTxjinNteYmt9/7fuN9+JCk75J7V9+4J93NWkmq6DzrXRktLTL1/39HjXHvknf3Otbls1qmOR0AAAC/GfAB94xvfUCgUGnWZP3/+WP8YAMAENy5/grviiiv00ksv/e8PiV6wf+kDAHgyLpMhGo2qrs79M2AAAB894/Ic0FtvvaWGhgbNnj1bX/jCF3Tw4OmfRMtms+rr6xt1AQBMfmM+gJYsWaJNmzZp69at2rhxow4cOKBPf/rT6u8/9atEWltblUqlRi6NjY1jvSQAwAVozAfQypUr9Wd/9mdauHChli9frn/7t39TT0+PfvzjH5+yfv369ert7R25dHS4fwQ2AGDiGvdXB1RVVenSSy/Vvn2n/sz0RCKhRCIx3ssAAFxgxv19QAMDA9q/f7/q6+vH+0cBACaQMR9AX/rSl9TW1qbf//73+q//+i999rOfVSQS0ec+97mx/lEAgAlszP8Ed+jQIX3uc5/T8ePHNW3aNH3qU5/Szp07NW3aNFOfYiHrHMVTM6XGue+ci2aY1vHO/t8612by7rE9kpQuuMVVSFJV0naommqanGtDiUpT73febjfV/+53FzvXNk9rMPUezueda2um2t4aUKh2f9R+5Ei3qffxI4dM9cly9z9TB/miqXdHx++da3OD7pEzkhSKu6974Og7pt6v79zqXBsJR0y908ZX48YN73UMl1eYeve+635utQ/1mnoHhlStfMY9Qiifc7tvG/MB9NRTT411SwDAJEQWHADACwYQAMALBhAAwAsGEADACwYQAMALBhAAwAsGEADACwYQ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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx = 3\n",
    "print(\"数字标签为：\", Y_data[pri_risk_rank[idx]])\n",
    "print(\"成员表现\", dat_in[pri_risk_rank[idx], 0])\n",
    "print(\"非成员表现\", dat_out[pri_risk_rank[idx], 0])\n",
    "imshow(X_data[pri_risk_rank[idx]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "c8d06f34-afa2-45ad-a697-5b27cec9dfbc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数字标签为： 5\n",
      "成员表现 [3.26029694e-04 7.00438440e-01 1.45877784e-05 1.32667265e-05\n",
      " 3.62422943e-05 2.57718772e-01 2.06548023e-07 3.71048507e-08\n",
      " 1.68584756e-05 4.14355360e-02]\n",
      "非成员表现 [1.13487738e-06 9.64968383e-01 9.17352977e-18 3.48208204e-16\n",
      " 3.78427246e-20 1.09540571e-16 1.79789216e-18 1.44676751e-14\n",
      " 3.42129388e-05 3.49963456e-02]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx = 6\n",
    "print(\"数字标签为：\", Y_data[pri_risk_rank[idx]])\n",
    "print(\"成员表现\", dat_in[pri_risk_rank[idx], 0])\n",
    "print(\"非成员表现\", dat_out[pri_risk_rank[idx], 0])\n",
    "imshow(X_data[pri_risk_rank[idx]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "fc50ca5b-009c-4198-b631-98db02e6d577",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数字标签为： 8\n",
      "成员表现 [2.67767062e-30 1.93771409e-33 6.42455909e-27 2.16760637e-13\n",
      " 7.78648933e-17 7.40283738e-19 1.38827631e-32 1.10321235e-27\n",
      " 1.00000000e+00 3.07473988e-34]\n",
      "非成员表现 [1.78550223e-08 1.22480008e-22 8.39063525e-01 1.60936415e-01\n",
      " 1.29333455e-09 2.95980324e-11 7.57725371e-13 3.07060084e-08\n",
      " 6.95028790e-19 4.44693144e-14]\n"
     ]
    },
    {
     "data": {
      "image/png": "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XHRs165da2ex49TS0qIbbrhBeXl5Ki4u1m233ab29va4mqGhITU1NWnWrFnKzc3V+vXr1dvba2nF4+NmP1euXHnR8XzggQcsrXh8tmzZourq6tiHTevq6vSb3/wmdv1kHcu0CKBf/vKX2rRpkx577DH953/+p2pqatTQ0KC+vj7bS0uo6667Tt3d3bHtjTfesL2kCRkYGFBNTY02b9485vVPPfWUfvjDH+qZZ57RgQMHNHPmTDU0NGhoaGiSVzoxl9tPSVq7dm3csX3uuecmcYUT19raqqamJu3fv1+vvvqqRkZGtGbNGg0MDMRqHnnkEb300kt6/vnn1draqq6uLt1xxx0WV23OzX5K0n333Rd3PJ966ilLKx6fiooKPfnkk2pra9PBgwe1atUqrVu3Tu+8846kSTyWThpYtmyZ09TUFPs6Eok45eXlTktLi8VVJdZjjz3m1NTU2F5G0khydu7cGfs6Go06paWlzne/+93YZf39/Y7f73eee+45CytMjI/vp+M4zoYNG5x169ZZWU+y9PX1OZKc1tZWx3E+OnZZWVnO888/H6t57733HEnOvn37bC1zwj6+n47jOJ/73Oecv/3bv7W3qCS54oornJ/85CeTeixT/gxoeHhYbW1tqq+vj13m9XpVX1+vffv2WVxZ4h05ckTl5eWaN2+evvzlL+v48eO2l5Q0HR0d6unpiTuugUBAtbW1U+64StKePXtUXFyshQsX6sEHH9Tp06dtL2lCgsGgJKmwsFCS1NbWppGRkbjjuWjRIs2ZMyetj+fH9/OCX/ziFyoqKtLixYvV3NyswcFBG8tLiEgkoh07dmhgYEB1dXWTeixTbhjpx506dUqRSEQlJSVxl5eUlOgPf/iDpVUlXm1trbZt26aFCxequ7tbjz/+uG6++Wa9/fbbysvLs728hOvp6ZGkMY/rheumirVr1+qOO+5QVVWVjh07pr//+79XY2Oj9u3bp4wMwz/GlAKi0agefvhh3XTTTVq8eLGkj46nz+dTQUFBXG06H8+x9lOSvvSlL2nu3LkqLy/X4cOH9Y1vfEPt7e369a9/bXG15t566y3V1dVpaGhIubm52rlzp6699lodOnRo0o5lygfQdNHY2Bj7d3V1tWprazV37lz96le/0r333mtxZZiou+66K/bvJUuWqLq6WvPnz9eePXu0evVqiysbn6amJr399ttp/xrl5VxqP++///7Yv5csWaKysjKtXr1ax44d0/z58yd7meO2cOFCHTp0SMFgUP/yL/+iDRs2qLW1dVLXkPK/gisqKlJGRsZF78Do7e1VaWmppVUlX0FBga6++modPXrU9lKS4sKxm27HVZLmzZunoqKitDy2Gzdu1Msvv6zf/va3cX82pbS0VMPDw+rv74+rT9fjean9HEttba0kpd3x9Pl8WrBggZYuXaqWlhbV1NToBz/4waQey5QPIJ/Pp6VLl2r37t2xy6LRqHbv3q26ujqLK0uuc+fO6dixYyorK7O9lKSoqqpSaWlp3HENhUI6cODAlD6u0kd/9ff06dNpdWwdx9HGjRu1c+dOvf7666qqqoq7funSpcrKyoo7nu3t7Tp+/HhaHc/L7edYDh06JElpdTzHEo1GFQ6HJ/dYJvQtDUmyY8cOx+/3O9u2bXPeffdd5/7773cKCgqcnp4e20tLmK9+9avOnj17nI6ODuff//3fnfr6eqeoqMjp6+uzvbRxO3v2rPPmm286b775piPJ+d73vue8+eabzp/+9CfHcRznySefdAoKCpwXX3zROXz4sLNu3TqnqqrKOX/+vOWVm/mk/Tx79qzzta99zdm3b5/T0dHhvPbaa86nP/1p56qrrnKGhoZsL921Bx980AkEAs6ePXuc7u7u2DY4OBireeCBB5w5c+Y4r7/+unPw4EGnrq7Oqaurs7hqc5fbz6NHjzpPPPGEc/DgQaejo8N58cUXnXnz5jkrVqywvHIz3/zmN53W1lano6PDOXz4sPPNb37T8Xg8zr/92785jjN5xzItAshxHOdHP/qRM2fOHMfn8znLli1z9u/fb3tJCXXnnXc6ZWVljs/ncz71qU85d955p3P06FHby5qQ3/72t46ki7YNGzY4jvPRW7G//e1vOyUlJY7f73dWr17ttLe32130OHzSfg4ODjpr1qxxZs+e7WRlZTlz58517rvvvrT74Wms/ZPkbN26NVZz/vx556//+q+dK664wsnJyXFuv/12p7u7296ix+Fy+3n8+HFnxYoVTmFhoeP3+50FCxY4f/d3f+cEg0G7Czf0V3/1V87cuXMdn8/nzJ4921m9enUsfBxn8o4lf44BAGBFyr8GBACYmgggAIAVBBAAwAoCCABgBQEEALCCAAIAWEEAAQCsIIAAAFYQQAAAKwggAIAVBBAAwAoCCABgxf8D5OV7yKjc1BkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx = 7\n",
    "print(\"数字标签为：\", Y_data[pri_risk_rank[idx]])\n",
    "print(\"成员表现\", dat_in[pri_risk_rank[idx], 0])\n",
    "print(\"非成员表现\", dat_out[pri_risk_rank[idx], 0])\n",
    "imshow(X_data[pri_risk_rank[idx]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "8cc10ac6-64be-43db-a8a0-8f63f9dd531f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数字标签为： 2\n",
      "成员表现 [1.13520183e-11 2.33413926e-15 9.99849558e-01 1.83302404e-07\n",
      " 1.50035077e-04 1.30294446e-17 1.44365274e-07 1.49745649e-09\n",
      " 1.98978096e-08 1.63006197e-17]\n",
      "非成员表现 [2.76038991e-14 4.51283325e-16 1.08755872e-10 8.72287095e-01\n",
      " 6.04639277e-02 1.46516456e-15 6.72489926e-02 7.84331096e-13\n",
      " 2.82550761e-09 1.31817991e-13]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvp0lEQVR4nO3de3SV9Z3v8c/Obee+kxBygwDhDkKwosYMSlEyXDrjeOHM0rbnDHZcurTRNcp02jKr1erMnDh2nda2h+IfdaCuVbQ6p+jS02IVJRxbQKEgFzECjRJKEiSQCwnZuezn/KFmGgX9fSHhl4T3a61nLZL94Zvfs5+99zdP9t7fHQqCIBAAABdYnO8FAAAuTjQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXCb4X8EmxWExHjx5VRkaGQqGQ7+UAAIyCIFBbW5uKiooUF3f285wh14COHj2q4uJi38sAAJynuro6jR079qyXD1oDWrVqlb7//e+roaFBc+bM0U9+8hNdeeWVn/v/MjIyJEmjR4/+zM7551xzkpSQYNtlS76np2fQass4MCmIuf+HuHjbX2JjsZgpb6tvO+u1VA4ba1uu88Ba2nh2HzPErWuxCPXajv1gGswpYtbSlni0p9tUOz4h3jlrfQyyPHZaru9YLKY//elPfY/nZzMoDeiXv/ylVqxYoccff1xlZWV67LHHtHjxYtXU1CgvL+8z/+/Hf3aLi4sblAZkyQ6l2uYGZPgP8XHuN/BzER9vqT94DSje3CUMUWvpONt/sPSrQW1Ag1ncaHAbkK22JT1cH4PO5fr+vKdRBuVFCD/4wQ90xx136Gtf+5pmzpypxx9/XKmpqfqP//iPwfhxAIBhaMAbUFdXl3bs2KGKior/+iFxcaqoqNCWLVs+lY9Go2ptbe23AQBGvgFvQMePH1dvb6/y8/P7fT8/P18NDQ2fyldVVSkSifRtvAABAC4O3t8HtHLlSrW0tPRtdXV1vpcEALgABvxFCLm5uYqPj1djY2O/7zc2NqqgoOBT+XA4rHA4PNDLAAAMcQN+BpSUlKS5c+dq48aNfd+LxWLauHGjysvLB/rHAQCGqUF5GfaKFSu0fPlyXX755bryyiv12GOPqb29XV/72tcG48cBAIahQWlAt9xyiz744AM98MADamho0KWXXqoNGzZ86oUJAICLVygYzHdznYPW1lZFIhEVFhY6v0nK8s78U6dOmdZjeX4qOTnZVDspKck5m2ic4NDd5f5u66TERFPt3t5eUz45JcU529Nreyd3yDLxocd2U48zvFk0ML4B0D45YfBqhwxv/g0Zp2BY30A9WKy3Wct1IkmnOtqds6mZnz0d4JPiE93fyN3aYnsbi2XepiUbi8VUV1enlpYWZWZmnjXn/VVwAICLEw0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4AUNCADgxaDMghsIQRA4fwa5ZZpQNBo1rSPFMEbG6kwf0Hc2pbNnm2qnpaQ6Zw+/956ptmWEkCR1Rzuds3Eh2+9EiYYxQolh283dcrvqMY56CYwzaiwDcKzTtYLAvXqccUSNNW7R1dXlnLXeZjs6Okz5CRMmOGdTMtJMtU82Nztnm443mWpbxutYxpK51uUMCADgBQ0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4AUNCADgBQ0IAODFkJ0FFwqFnOcJWeY8WWYfSVJbW5tz1jo3rqen2zm7Z/dbptrlZWXO2bQ027rDica5Wu2WuVq2OWYyzGBr7XSfSSdJcXHuv59Z5mRJUmKC+ww7SQoZ1tLd02OqHYu5z4ILemwz72SYS2e9byYkuD98dUXd58ZJUm5urilvmTF5sq3FVDvZ8LiSmZlpqt3e3u6ctdwfnGsOeEUAABzQgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF4M2VE8gyU1NdWUt4zisYw0kaQEwziW5ETboTp1qtU5O3v2Jabao7NHmfIH3z3gnA0bxipJUk+v+3X+Vk2NqXbHqVPO2YL8fFPtky22cSynT592zka73MfCSFJe7mjnbGJcvKm2DON1Oo2jkiz3tzFjxphqW0crvbH9TedsXmGBqXa0y32MUEeHZeyVFB/vfjwt17drljMgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBdDdhZcKBRSyHGOlGWeUUKCbZfj4tx7dJdhZpNkm3tWUGybZdXY0OicHT+m2FS7K8U2s2tySYlz9nDte6bao0a5z6VLy0g31U5KS3HOdhjnmKWlpZny9fX1ztnsrCxT7VzDddjabJthZ7lvFhTYZqRFIhHnbJbxOjlwwH1+oSTNmzfPOfuH3W+ZalvmUXZ3d5tqjx7tPgfQcixdH7s5AwIAeDHgDeh73/te39nLx9v06dMH+scAAIa5QfkT3CWXXKJXXnnlv36I8c9eAICRb1A6Q0JCgvnvuQCAi8ugPAd04MABFRUVaeLEifrqV7+qw4cPnzUbjUbV2trabwMAjHwD3oDKysq0du1abdiwQatXr1Ztba2uueaas76So6qqSpFIpG8rLra9IgsAMDwNeANaunSp/vZv/1alpaVavHixfv3rX6u5uVnPPPPMGfMrV65US0tL31ZXVzfQSwIADEGD/uqArKwsTZ06VQcPHjzj5eFw2Pz56wCA4W/Q3wd06tQpHTp0SIWFhYP9owAAw8iAN6BvfOMbqq6u1nvvvaff//73uummmxQfH68vf/nLA/2jAADD2ID/Ce7IkSP68pe/rKamJo0ePVpXX321tm7dahr5IH049sF1DI5lXE4QBKZ19Pb2OmeTDKN1rD44ftyUnzp5knN27549ptozpkwx5WfNmOmcHT/WOBYo5n58jp9oMtWOZGc7ZxOTbce+K2ob21RiGGcUNY4FOm64bWVHsky1MzMznbOWsUqS1NPT45xNTEw01R4zxjb66g+7djpnW1ps44ws+2l9DLJcL4MximfAG9DTTz890CUBACMQs+AAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF4M+scxXAiWeW2pKSmm2u3t7c7ZaJdtvldSgvtspSBw30dJihhmcCXYxuOZZ40lGmb1ZUfc1y1JcYbZV/mFto+Jbzp50jk7sWSiqXZxkW3WWN377ztnG4/Wm2pbZo3lGOe1ZWdlOWet8yK7u7uds3VHbJ8ztm/fPlP+aP1R52zCIH78jHXWpeWjcCyPs644AwIAeEEDAgB4QQMCAHhBAwIAeEEDAgB4QQMCAHhBAwIAeEEDAgB4QQMCAHhBAwIAeDFkR/EEQeA8ViIUF3KuG05JNq2jqKjQOXvs2DFT7a6o+0ibIBYz1T582H30yJSSElPt4gL360SSRo/Oc87WvL3fVLuto8M5m2QY2yNJ4ST3MSXhxERT7ZMnTpjyTU1Nztm5c+eaar/99tvO2ZhhbI8kJSS4P8RkGsZHSdLJk+7X4d49e0y1Lde3ZDv+HZ1RU+2ERPfr0DJaR5Li493HgVlGNrk+dnMGBADwggYEAPCCBgQA8IIGBADwggYEAPCCBgQA8IIGBADwggYEAPCCBgQA8IIGBADwggYEAPBi6M6CC324ueiV29whSQpi3aZ1pKemOGcnlowz1c4bleucDSfb5pg11je4Z48fN9UOuR6Yj1x+eZlztqPbNmvs1c2bnbPT5l5qqp2fM8o5+85+2wy74uJiU/5US4tz9kST7XimJbvPR2xvdV+HJE0qv8o5m5WdZaq9qXqjc3bKFNu8wzLjbSUtNd05++KG35pqB/Hu5wkp6Wmm2t097o+HcYZ1BI6PyZwBAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALwYsrPgFAp9uDlwnwQnxRQzLaMz2umcnTZpkql26fQZztnkFPd5XZK0vXeHczbaETXVPnDooCnfaJhNNmWG+3UiSYfr652zCbLNsAt63W8rqWHb8SkYnWfKt7e2OWfT02zzwNTb6xwtLhxjKp0diThnR+ePNtXu6XWfG1gyYYqpdlpS2JSfOnmac7az0zaP8vU3tjln4+PjTbUtj50hx8fjj8JOMc6AAABemBvQ5s2bdf3116uoqEihUEjPPfdcv8uDINADDzygwsJCpaSkqKKiQgcOHBio9QIARghzA2pvb9ecOXO0atWqM17+6KOP6sc//rEef/xxbdu2TWlpaVq8eLE6O93/lAUAGPnMzwEtXbpUS5cuPeNlQRDoscce03e+8x3dcMMNkqQnn3xS+fn5eu6553Trrbee32oBACPGgD4HVFtbq4aGBlVUVPR9LxKJqKysTFu2bDnj/4lGo2ptbe23AQBGvgFtQA0NH34KZ35+fr/v5+fn9132SVVVVYpEIn2b9ZMiAQDDk/dXwa1cuVItLS19W11dne8lAQAugAFtQAUFBZKkxsbGft9vbGzsu+yTwuGwMjMz+20AgJFvQBtQSUmJCgoKtHHjxr7vtba2atu2bSovLx/IHwUAGObMr4I7deqUDh78r3fC19bWateuXcrJydG4ceN033336V//9V81ZcoUlZSU6Lvf/a6Kiop04403DuS6AQDDnLkBbd++Xddee23f1ytWrJAkLV++XGvXrtU3v/lNtbe3684771Rzc7OuvvpqbdiwQcnJtlEloVDIefRDKM59RERCvG0ci+UUscv4XqfuLveRHM2GcTaSNN9wxhmKs43vWLPm56a8ZXTPbbd9zVS7tu6wc/btd/abasfHux9964tnTp8+bcqPKSpyzvZ0u4+okT79oqHPctnlc221Cwuds/979ZnfW3g2b7653TlbMCrHVLsgN9eUf/31152z4ZQMU23LsW9qbTbV7gncx00FgWFwj2PW3IAWLFjwmQsJhUJ6+OGH9fDDD1tLAwAuIt5fBQcAuDjRgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF6YR/FcKHGhkOKcZ8G591HL3DhJ6jLM7CrIP/NHTpzN4fffd87Ou/xyU+0xY8Y4Z3ft3WuqvWjxIlP+99u2OWezf/2iqfZV8+c5ZzMithlcde+7z5mz6umxzWs728eZnElvb6+p9owZM5yzLcZPLN6+c6dz9uTJk6bat956i3M2bLzfp6akmvI9UffjWW2YGydJk6ZPc852hwzz2iSdaLZd5wONMyAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBcX3SieONlGVSQmuF9F1lEivac7nbNfmF1qqv32/reds3+qqzPVfmPnW6Z8QkrYObv+xedNtTNHZTtnFy+yjRB6+aXfOmePHDliql1/7Jgpn5qS4pzNHT3aVLt47Fjn7P98pMpU+9B77zlnc0ePMtXuNIzJunTuZabacd22cUbzyv7COfunYydMtev+9CfnbFw40VTbMhIqnOR+P+6V22M3Z0AAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL4bsLLhQ8OHmIt5x7pAkBbGYaR0pye4zuOJDtn7+hcvc51NFT3eYap88/oFzticaNdX+67/5kimfGok4Z1/fttVUe9/+fc7Z9PgkU+2MjAzn7GnDXDJJamtrM+Uts+bS09NNtbds2eK+jqNHTbU7OtxvtxMnXWmqnWKYj/faq6+Zas+cONmUnzJpinN20qRJptp7a95xzhZNGGeq3RNzn3lnmRsXCpgFBwAYwmhAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL4bsKB4FH20DLDHBtsvxce49ujvaZao91zCK59DBA6baPb3uYzNyRmWbai9ceJ0pv/pn/+GcjU+IN9WeMWOGc7a1tdVUe+ok93Es+/fvN9W+quwqU35T9SbnbNmVZabaW9/Y5pydXTrbVLu5tcU5e+rUKVPte7/+defsT37wv0y1ExNtjxPNJ046ZwsLCky1O6OdztmjxlFJSclh52zMMMYs1us24oczIACAFzQgAIAX5ga0efNmXX/99SoqKlIoFNJzzz3X7/LbbrtNoVCo37ZkyZKBWi8AYIQwN6D29nbNmTNHq1atOmtmyZIlqq+v79ueeuqp81okAGDkMb8IYenSpVq6dOlnZsLhsAqMT7QBAC4ug/Ic0KZNm5SXl6dp06bp7rvvVlNT01mz0WhUra2t/TYAwMg34A1oyZIlevLJJ7Vx40b9+7//u6qrq7V06VL1nuVleVVVVYpEIn1bcXHxQC8JADAEDfj7gG699da+f8+ePVulpaWaNGmSNm3apIULF34qv3LlSq1YsaLv69bWVpoQAFwEBv1l2BMnTlRubq4OHjx4xsvD4bAyMzP7bQCAkW/QG9CRI0fU1NSkwsLCwf5RAIBhxPwnuFOnTvU7m6mtrdWuXbuUk5OjnJwcPfTQQ1q2bJkKCgp06NAhffOb39TkyZO1ePHiAV04AGB4Mzeg7du369prr+37+uPnb5YvX67Vq1dr9+7d+vnPf67m5mYVFRVp0aJF+pd/+ReFw+4zhyQpFAopLhRyysbJLSe5zyjqyxuyrW22V/AdePdd52xGku1QZUbc/5TZGdiG7kWjUVO+ufmE+1oMM+wkKScScc4eaXjPVDuS6V674tpPP7/5WcKGGVySNG3qVOdsamqqqXb15mrn7NXXftFU+9cvbXDORrtst6vEpETnbOnsWabaozOyTPk2w6t3YzHb/e30afdZcPHJSabayakppryrwPExxdyAFixY8JnFX3rpJWtJAMBFiFlwAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvBvzzgAZK6KPNKes4M06SjGOYNGFCiXP25LHjptppqWnO2ews96wkRbu7nLONhlltknTqlG3m3f/47191zr6xY6epdsmECc7ZvVtttbMy3OfpHT1yxFR7z1tvmfLzrp7nnG0+2WyqnZToPlNtxsyZptpP/+ezztm/+ItyU23D3V71R+tNtadcMc6U7+lynzGZl5dtqp2W5j7bLz5+8B7SXee7WbKcAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvBiyo3gUCtlmbTiKi7P13KmTJztn3zkdNdXuON3hnM3NzTDV7jrd7ZwdUzzWVHvvnj2m/N8sW+actYyckaR/ffjfnLPZyRFT7ZSUFOfsSxt+a6r95ptvmvLjx493zra1tZlq19a+55zdtLnaVPvJJ590zkYi7qOPJOnnT/zMOZuTnWOqbb0OIxlZztmkdNtYrUzDSKj4lLCpdnyiewuIxWLO2d5et9FEnAEBALygAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvKABAQC8oAEBALygAQEAvBiys+A+HAXnNgsuzjAzrrfHfZ6RJEU73WeqRbvcs5IU7XZfS92RY6baKSnJztnTnadNtXMitplqv1izxjnbbpyn136yxTlbOneGqfb/+93vnLNt0U5T7YnTp5vyGzf/P+fspPHjTLUvnT3LOfvmtq2m2inhROdsQsj2+3Dz8ePO2UsmTTHVbm86Ycr3RN1mn0lSaqL7dSJJJ0+edM4WpBaZaluu83bD4wSz4AAAQxoNCADgBQ0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4AUNCADgBQ0IAOAFDQgA4MUQHsUTp1CcW38MGcZJJCUkmdbRaxiX09rWbqodxLmP5AiFbOtubelwzh7647um2jMvsY2RmTpxonN2y+/fMNW+6rIrnLP5o3NNtQ/VHXXO9sbZ7ko5haNN+T8eOOCc/cvrrjXVzkhzH9tU1D7GVPt4g/t1eMlU2+0qK9H9PtFQd8RUe2rJJFM+NSPTOfvuB7axWoEC52xmerqpdnZWtnO2trbWORvnOB2NMyAAgBemBlRVVaUrrrhCGRkZysvL04033qiampp+mc7OTlVWVmrUqFFKT0/XsmXL1NjYOKCLBgAMf6YGVF1drcrKSm3dulUvv/yyuru7tWjRIrW3/9efnu6//3698MILevbZZ1VdXa2jR4/q5ptvHvCFAwCGN9Mfrjds2NDv67Vr1yovL087duzQ/Pnz1dLSoieeeELr1q3TddddJ0las2aNZsyYoa1bt+qqq64auJUDAIa183oOqKXlw89iycnJkSTt2LFD3d3dqqio6MtMnz5d48aN05YtW85YIxqNqrW1td8GABj5zrkBxWIx3XfffZo3b55mzfrwA60aGhqUlJSkrKysftn8/Hw1NDScsU5VVZUikUjfVlxcfK5LAgAMI+fcgCorK7V37149/fTT57WAlStXqqWlpW+rq6s7r3oAgOHhnN4HdM899+jFF1/U5s2bNXbs2L7vFxQUqKurS83Nzf3OghobG1VQUHDGWuFwWOFw+FyWAQAYxkxnQEEQ6J577tH69ev16quvqqSkpN/lc+fOVWJiojZu3Nj3vZqaGh0+fFjl5eUDs2IAwIhgOgOqrKzUunXr9PzzzysjI6PveZ1IJKKUlBRFIhHdfvvtWrFihXJycpSZmal7771X5eXlvAIOANCPqQGtXr1akrRgwYJ+31+zZo1uu+02SdIPf/hDxcXFadmyZYpGo1q8eLF++tOfDshiAQAjh6kBBcHnzyRKTk7WqlWrtGrVqnNe1GCKj7c97ZWfn++cTTLMppKkmv3vOGevX/IlU+0tWzY7Zy8tnWOqnRmxzZvat3evc/aSGTNNtb9w6aXO2a6uXlPtti73OYDh5IOm2vUNtukghWPGfn7oI2np7nPJJCljovssuEhrk6n2pk2bnLPRzqipdnrYfd3RFPesJNUZZthJ0qVFhc7Zxr22Yx9nmHWZlppqqm15fDt+/LhztqfX7b7GLDgAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBfn9HEMF0IoFFIoFHLOOteNc89K0unTp52zY8aMMdU+cfKEczb3o0+ddfXFedc4ZwN1mWq/U/O2KZ/ziQ8o/CyTJk4x1S7Icx8lUnv4T6baf3zvfefsuAkTTLXjz/IBjWdz8gP3MSjdjmNQPnb5pZc5Z5tPHjPVPmAYN3XgnRpT7fnz5jlnU5JTTLVjMdt12NnT7Zzds2ePqXZubq5zdvbsUlNty+Nbd7f7PvYyigcAMJTRgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXgzZWXAmQeAcTUlONpWeMsV9NtmJpiZT7ZNN7rPgtr/xhql2xcIFztmWVvc5Y5I0ftw4U76np8c5Gx9n+53o3Zp3nbPHW06Zar9fd8Q52xlzvw1KUmtHhylvmQX37oFDptrZaanO2aS4mKn2ZaVznLN/rK011e4y3K7Cxvv9+AnjTfl9hjl2Y4uLTbWvWbDAOdt+ynYbT0tLc84mJSU5Z3t63Y4NZ0AAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC+G7CieUCikUCjknHWVkGDb5V7HkRKSdNlll5lq5+flO2c7u7pMtXfu2uWcHTeh0FS7ZOJEUz41JcU5m56eZar97rvuY2d6TjSbavd0dztnT3e5304kqafLvbYk9cbcR+CcOOk+4kmS9u3b55ydUDDaVDuSnumc/au/+mtT7dZTbc7Ztg7biJrjzbbrMJziPuqn8t57TLW3/H6Lc/bQwYOm2llZWc7ZjIwM56zr+C3OgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABejIhZcPEJ8c51W1paTOv4Y22tczY9Nc1UO2dUjnP2+kVLTLUb6484Z+MT3OeMSVK+cR5YW5v7zK7GD46Zakeys5yzcyKjTLUPHXa/DnfX1JhqN59sMuUVuB+jUYbrRJLmzJrlnM0IJ5pqZ48yrCXe/X4sSR2nO5yzOTnu9zVJirmPl5Qk/cU1X3TO/t/fvGKqbZnVl52dbartOrNNkmKGeYSuWc6AAABemBpQVVWVrrjiCmVkZCgvL0833nijaj7xm9+CBQv6zl4+3u66664BXTQAYPgzNaDq6mpVVlZq69atevnll9Xd3a1Fixapvb29X+6OO+5QfX193/boo48O6KIBAMOf6TmgDRs29Pt67dq1ysvL044dOzR//vy+76empqqgoGBgVggAGJHO6zmgj5/Q/+QTfL/4xS+Um5urWbNmaeXKleroOPuThdFoVK2trf02AMDId86vgovFYrrvvvs0b948zfqzV9F85Stf0fjx41VUVKTdu3frW9/6lmpqavSrX/3qjHWqqqr00EMPnesyAADD1Dk3oMrKSu3du1evv/56v+/feeedff+ePXu2CgsLtXDhQh06dEiTJk36VJ2VK1dqxYoVfV+3traquLj4XJcFABgmzqkB3XPPPXrxxRe1efNmjR079jOzZWVlkqSDBw+esQGFw2GFw+FzWQYAYBgzNaAgCHTvvfdq/fr12rRpk0pKSj73/+zatUuSVFhYeE4LBACMTKYGVFlZqXXr1un5559XRkaGGhoaJEmRSEQpKSk6dOiQ1q1bpy996UsaNWqUdu/erfvvv1/z589XaWnpoOwAAGB4MjWg1atXS/rwzaZ/bs2aNbrtttuUlJSkV155RY899pja29tVXFysZcuW6Tvf+c6ALRgAMDKY/wT3WYqLi1VdXX1eC/qYZRZcSO6Dm+ITbE97JSUmOWe7urtMtf+weYdztmLBdabaU2ZMd852nLbNx/vggwZT/plnnnFfS4ftOrzx+pucs6OybbPgFi+81jm79539ptpNHzSa8ksqKpyzf3vzjabaCb3u88Ce/9X/MdVu72j//NBH5l0zz1Q7K9f9eGbl5ppqJycnm/LHGt2P5/Y33zTVTjI8R55gfHyLRqPOWcvcONcss+AAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF7QgAAAXtCAAABe0IAAAF6c8+cBDba4uDjFxbn1R9eRPZKUmJBoWkfTiSbn7NiiMabaxz74wDn7y2d/aap9081/45yNi+s11X7/yBFTflTeaOds++F6U+1Xq19zzl5zZZmp9riJk52zl5VeYqq9b98eU/7Lt/w352xS3GePzPqkTa++6pxtbW8z1baMetn11lum2sXjxztnZ2dkmGqnGEfx/OSxHzln39hpO/ZTpk51zn48INrVl770Jefsx59s4KK31+0xhTMgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBc0IACAFzQgAIAXNCAAgBdDdhZcKBRynvEWcpwZJ0kJCfGmdby9723n7Lvv1Jhqu866k6T6xkZT7aOGmVBNJ2zzozo72035pBT3uVp5hfmm2gffOeCcfeftdFPtorHus/0umTHNVPsLpbNM+Z6uTufs7l1/MNU+brhthZPDptpHGtxn+2VkRUy133/vPVPeIjs7y5Q/2eQ+MzIhwfawO3HiROdsZmamqXZzc7NzNtkwH6+np8cpxxkQAMALGhAAwAsaEADACxoQAMALGhAAwAsaEADACxoQAMALGhAAwAsaEADACxoQAMCLITuKx8JtYM+Henp6TbVPd3Y4ZyeMH2+qXVRU6Jytfa/WVLujw31czhVlZabab+3aYcpbRg41t7SaapfOcR9ps3/3HlPtMRPGOWct41Ikaf68q0z5D+qPOGd3vfmmqXZvV5dztmjcWFPtL3xhjnO2s8N93JAklZSUmPIWLcbb4cGDh5yzqdmjTLX379/vnM3OzjbVPnHihHM2IzPDOdvNKB4AwFBGAwIAeEEDAgB4QQMCAHhBAwIAeEEDAgB4QQMCAHhBAwIAeEEDAgB4QQMCAHhBAwIAeDEiZsEFhmxvr9uMoo+lpqY4Z7MiWabaBfn5ztlLSy8x1S4eU+ScLcorMNXOvOpqU76ltdk5+/stvzPVfvONN5yztUfrTLU3/a7aOTvj5Aem2plpSab8Hw/WOGdLJtpmElpu4x3t7jMGJSkuzn1S48wvlJpqT5s50zkb7eo21d65c7cpf+NNNzlnQwnJptobX33VOdve1maqPXHKFOdsb+D+SBtzzHIGBADwwtSAVq9erdLSUmVmZiozM1Pl5eX6zW9+03d5Z2enKisrNWrUKKWnp2vZsmVqbGwc8EUDAIY/UwMaO3asHnnkEe3YsUPbt2/XddddpxtuuEH79u2TJN1///164YUX9Oyzz6q6ulpHjx7VzTffPCgLBwAMb6bngK6//vp+X//bv/2bVq9era1bt2rs2LF64okntG7dOl133XWSpDVr1mjGjBnaunWrrrrK9vknAICR7ZyfA+rt7dXTTz+t9vZ2lZeXa8eOHeru7lZFRUVfZvr06Ro3bpy2bNly1jrRaFStra39NgDAyGduQHv27FF6errC4bDuuusurV+/XjNnzlRDQ4OSkpKUlZXVL5+fn6+Ghoaz1quqqlIkEunbiouLzTsBABh+zA1o2rRp2rVrl7Zt26a7775by5cv19tvv33OC1i5cqVaWlr6tro620tlAQDDk/l9QElJSZo8ebIkae7cuXrzzTf1ox/9SLfccou6urrU3Nzc7yyosbFRBQVnf59JOBxWOBy2rxwAMKyd9/uAYrGYotGo5s6dq8TERG3cuLHvspqaGh0+fFjl5eXn+2MAACOM6Qxo5cqVWrp0qcaNG6e2tjatW7dOmzZt0ksvvaRIJKLbb79dK1asUE5OjjIzM3XvvfeqvLycV8ABAD7F1ICOHTumv/u7v1N9fb0ikYhKS0v10ksv6S//8i8lST/84Q8VFxenZcuWKRqNavHixfrpT386KAvvxzAiwvrnvvHF45yzY8aOMdXOGTXKOVvx0XXsKjEh3jkb67GNJ0pLS7OtJcn9ZvaFSy811c7IyHDO7ojsMNUenZfnnN2/3/Y86Ogc92P/IffbeGub7ZWk9fVHnbOzZ80y1U5JcR/zM268+31NktLT052z7ceOm2p399hG92RlZTtnk9MyTbUtt/HR+e63WenDVyq7OmK4nfT09jrlTA3oiSee+MzLk5OTtWrVKq1atcpSFgBwEWIWHADACxoQAMALGhAAwAsaEADACxoQAMALGhAAwAsaEADACxoQAMALGhAAwAvzNOzBFnw0VqfXcZSDJMWFQs7ZHuPYma5u95Ec0WjUVPt0Z6dztu3UKVPtxHj3UTyJSbbfQwxXtySpu7vLOXuqvd1Uu+P0aedstMt9HZLU2el+PLu6bKNbolHbWmKG+0Nvb8y2FsP1YrnNSpYBQvZjn2y4T1hrW/ez03DfD+JttS2PWd2GxytJ6jTsp2UdH2eDzxmTFgo+L3GBHTlyhA+lA4ARoK6uTmPHjj3r5UOuAcViMR09elQZGRkK/dmv2q2trSouLlZdXZ0yM23D/IYT9nPkuBj2UWI/R5qB2M8gCNTW1qaioiLFxZ39LyxD7k9wcXFxn9kxMzMzR/TB/xj7OXJcDPsosZ8jzfnuZyQS+dwML0IAAHhBAwIAeDFsGlA4HNaDDz5o/kC54Yb9HDkuhn2U2M+R5kLu55B7EQIA4OIwbM6AAAAjCw0IAOAFDQgA4AUNCADgxbBpQKtWrdKECROUnJyssrIyvfHGG76XNKC+973vKRQK9dumT5/ue1nnZfPmzbr++utVVFSkUCik5557rt/lQRDogQceUGFhoVJSUlRRUaEDBw74Wex5+Lz9vO222z51bJcsWeJnseeoqqpKV1xxhTIyMpSXl6cbb7xRNTU1/TKdnZ2qrKzUqFGjlJ6ermXLlqmxsdHTis+Ny34uWLDgU8fzrrvu8rTic7N69WqVlpb2vdm0vLxcv/nNb/ouv1DHclg0oF/+8pdasWKFHnzwQf3hD3/QnDlztHjxYh07dsz30gbUJZdcovr6+r7t9ddf972k89Le3q45c+Zo1apVZ7z80Ucf1Y9//GM9/vjj2rZtm9LS0rR48WLTgMSh4PP2U5KWLFnS79g+9dRTF3CF56+6ulqVlZXaunWrXn75ZXV3d2vRokVq/7Mhn/fff79eeOEFPfvss6qurtbRo0d18803e1y1nct+StIdd9zR73g++uijnlZ8bsaOHatHHnlEO3bs0Pbt23Xdddfphhtu0L59+yRdwGMZDANXXnllUFlZ2fd1b29vUFRUFFRVVXlc1cB68MEHgzlz5vhexqCRFKxfv77v61gsFhQUFATf//73+77X3NwchMPh4KmnnvKwwoHxyf0MgiBYvnx5cMMNN3hZz2A5duxYICmorq4OguDDY5eYmBg8++yzfZn9+/cHkoItW7b4WuZ5++R+BkEQfPGLXwz+4R/+wd+iBkl2dnbws5/97IIeyyF/BtTV1aUdO3aooqKi73txcXGqqKjQli1bPK5s4B04cEBFRUWaOHGivvrVr+rw4cO+lzRoamtr1dDQ0O+4RiIRlZWVjbjjKkmbNm1SXl6epk2bprvvvltNTU2+l3ReWlpaJEk5OTmSpB07dqi7u7vf8Zw+fbrGjRs3rI/nJ/fzY7/4xS+Um5urWbNmaeXKlero6PCxvAHR29urp59+Wu3t7SovL7+gx3LIDSP9pOPHj6u3t1f5+fn9vp+fn6933nnH06oGXllZmdauXatp06apvr5eDz30kK655hrt3btXGRkZvpc34BoaGiTpjMf148tGiiVLlujmm29WSUmJDh06pH/+53/W0qVLtWXLFsUbPrdpqIjFYrrvvvs0b948zZo1S9KHxzMpKUlZWVn9ssP5eJ5pPyXpK1/5isaPH6+ioiLt3r1b3/rWt1RTU6Nf/epXHldrt2fPHpWXl6uzs1Pp6elav369Zs6cqV27dl2wYznkG9DFYunSpX3/Li0tVVlZmcaPH69nnnlGt99+u8eV4Xzdeuutff+ePXu2SktLNWnSJG3atEkLFy70uLJzU1lZqb179w775yg/z9n288477+z79+zZs1VYWKiFCxfq0KFDmjRp0oVe5jmbNm2adu3apZaWFv3nf/6nli9frurq6gu6hiH/J7jc3FzFx8d/6hUYjY2NKigo8LSqwZeVlaWpU6fq4MGDvpcyKD4+dhfbcZWkiRMnKjc3d1ge23vuuUcvvviiXnvttX4fm1JQUKCuri41Nzf3yw/X43m2/TyTsrIySRp2xzMpKUmTJ0/W3LlzVVVVpTlz5uhHP/rRBT2WQ74BJSUlae7cudq4cWPf92KxmDZu3Kjy8nKPKxtcp06d0qFDh1RYWOh7KYOipKREBQUF/Y5ra2urtm3bNqKPq/Thp/42NTUNq2MbBIHuuecerV+/Xq+++qpKSkr6XT537lwlJib2O541NTU6fPjwsDqen7efZ7Jr1y5JGlbH80xisZii0eiFPZYD+pKGQfL0008H4XA4WLt2bfD2228Hd955Z5CVlRU0NDT4XtqA+cd//Mdg06ZNQW1tbfC73/0uqKioCHJzc4Njx475Xto5a2trC3bu3Bns3LkzkBT84Ac/CHbu3Bm8//77QRAEwSOPPBJkZWUFzz//fLB79+7ghhtuCEpKSoLTp097XrnNZ+1nW1tb8I1vfCPYsmVLUFtbG7zyyivBZZddFkyZMiXo7Oz0vXRnd999dxCJRIJNmzYF9fX1fVtHR0df5q677grGjRsXvPrqq8H27duD8vLyoLy83OOq7T5vPw8ePBg8/PDDwfbt24Pa2trg+eefDyZOnBjMnz/f88ptvv3tbwfV1dVBbW1tsHv37uDb3/52EAqFgt/+9rdBEFy4YzksGlAQBMFPfvKTYNy4cUFSUlJw5ZVXBlu3bvW9pAF1yy23BIWFhUFSUlIwZsyY4JZbbgkOHjzoe1nn5bXXXgskfWpbvnx5EAQfvhT7u9/9bpCfnx+Ew+Fg4cKFQU1Njd9Fn4PP2s+Ojo5g0aJFwejRo4PExMRg/PjxwR133DHsfnk60/5JCtasWdOXOX36dPD1r389yM7ODlJTU4ObbropqK+v97foc/B5+3n48OFg/vz5QU5OThAOh4PJkycH//RP/xS0tLT4XbjR3//93wfjx48PkpKSgtGjRwcLFy7saz5BcOGOJR/HAADwYsg/BwQAGJloQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAvaEAAAC9oQAAAL2hAAAAv/j/TeryzOxy/xwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx = 9\n",
    "print(\"数字标签为：\", Y_data[pri_risk_rank[idx]])\n",
    "print(\"成员表现\", dat_in[pri_risk_rank[idx], 0])\n",
    "print(\"非成员表现\", dat_out[pri_risk_rank[idx], 0])\n",
    "imshow(X_data[pri_risk_rank[idx]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e7e30411-4a78-4189-a316-884d4dd4bc4c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e5b9c13-0d9f-45ac-8716-7f56b5b71c5d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "db75849b-c93d-426f-a3a2-405ad79fa514",
   "metadata": {},
   "source": [
    "### 绘制训练轮次的影响"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e565df92-d334-4543-82dc-dd612e077626",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = 600\n",
    "shadow_result = []\n",
    "LIRA_result = []\n",
    "gene_distance = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa71855d-dcdb-4360-8177-3528f8229240",
   "metadata": {},
   "outputs": [],
   "source": [
    "(x_train, y_train), (x_test, y_test), train_keep_exp, test_keep_exp = load_CIFAR10(0, 100, prop_keep=0.5, seed=0)\n",
    "training_data = CustomDataset(x_train, y_train, model_transform)\n",
    "train_dataloader = DataLoader(training_data, batch_size=batch_size)\n",
    "if model in ['NN', 'NN_4layer']:\n",
    "    TargetModel = globals()['create_{}_model'.format(model)](x_train.shape[1], y_train.max()+1)\n",
    "elif model == 'CNN':\n",
    "    TargetModel = globals()['create_{}_model'.format(model)](y_train.max()+1, data_name)\n",
    "# print(TargetModel)\n",
    "TargetModel.to(device)\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(TargetModel.parameters(), lr=1e-3)\n",
    "for t in range(50):\n",
    "    print(f\"Epoch {t+1}\\n-------------------------------\")\n",
    "    train(train_dataloader, TargetModel, loss_fn, optimizer, device)\n",
    "\n",
    "    test_acc = evaluate(test_dataloader, TargetModel, loss_fn, device)\n",
    "    train_acc = evaluate(train_dataloader, TargetModel, loss_fn, device)\n",
    "    distance = train_acc - test_acc\n",
    "    gene_distance.append(distance)\n",
    "    \n",
    "\n",
    "    x_test = X_data\n",
    "    y_test = Y_data\n",
    "    mem_label = train_keep[0]\n",
    "    # 加载目标模型\n",
    "    \n",
    "    all_data = CustomDataset(x_test, y_test, model_transform)\n",
    "    all_dataloader = DataLoader(all_data, batch_size=batch_size)\n",
    "    \n",
    "    conf_data, label_data = get_model_pred(all_dataloader, TargetModel, device)\n",
    "    conf_data = conf_data.detach().cpu().numpy()\n",
    "    label_data = label_data.detach().cpu().numpy()\n",
    "    conf_data = conf_data.astype(np.float64)\n",
    "    score_tar = cal_score(conf_data.copy(), label_data)\n",
    "\n",
    "    # 执行影子模型攻击\n",
    "    targetX = conf_data\n",
    "    targetY = mem_label\n",
    "    targetX = targetX.astype(np.float32)\n",
    "    targetX, _ = get_top_k_conf(3, targetX, targetX)\n",
    "    shadow_attack_data = CustomDataset(targetX, targetY, attack_transform)\n",
    "    shadow_attack_dataloader = DataLoader(shadow_attack_data, batch_size=batch_size, shuffle=False)\n",
    "    attack_test_scores, attack_test_mem = get_attack_pred(shadow_attack_dataloader, attack_model, device)\n",
    "    attack_test_scores, attack_test_mem = attack_test_scores.detach().cpu().numpy(), attack_test_mem.detach().cpu().numpy()\n",
    "    accuracy = evaluate_ROC(attack_test_scores, attack_test_mem)\n",
    "    shadow_result.append(accuracy)\n",
    "\n",
    "    # 执行风险评估攻击\n",
    "    score_tar = cal_score(conf_data.copy(), label_data)\n",
    "    pri_risk_t = pri_risk_all\n",
    "    pri_risk_rank_t = np.argsort(pri_risk_t)\n",
    "    pri_risk_rank_t = np.flip(pri_risk_rank_t)\n",
    "\n",
    "    pred_result = LIRA_attack(train_keep, score_all, score_tar, mem_label)\n",
    "    evaluate_ROC(pred_result, mem_label, threshold=0)\n",
    "    pred_clip = pred_result[pri_risk_rank_t[:x]]\n",
    "    mem_clip = mem_label[pri_risk_rank_t[:x]]\n",
    "    pred_clip = pred_clip > 0\n",
    "    accuracy = metrics.accuracy_score(mem_clip, pred_clip)\n",
    "    LIRA_result.append(accuracy)\n",
    "\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "opacus",
   "language": "python",
   "name": "opacus"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
